простой графический интерфейс программирования c

Я разработал решатель уравнений паровой таблицы на языке C... но ввод значений в консоль с черным экраном скучен.

Поэтому я строго хотел создать простой графический интерфейс на C.

Я искал коды hello world, все они были довольно длинными. Но это единственное, что я понял.

#include <windows.h>

int main()
{
MessageBoxA( NULL, "Hello World!", "Hello", MB_OK );
}

Используя конструктор графического интерфейса для C, я получил этот код, теперь я думал, как сканировать значения из TEXTBOX1 и TEXTBOX2 при нажатии COMMANDBUTTON1 и отображать вывод в TEXTBOX3?

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include "hello.auto.h"


HWND hwnd_Label1, hwnd_Label2, hwnd_TextBox1, hwnd_TextBox2, hwnd_CommandButton1,
hwnd_TextBox3;

HFONT MSSansSerif_8pt;



void CreateChildWindows(HWND hwndMainWindow, HINSTANCE hInstance)
{
InitCommonControls();

MSSansSerif_8pt = CreateFont(-11,0,0,0,FW_NORMAL,0,0,0,0,0,0,0,0,"MS Sans Serif");

hwnd_Label1 = CreateWindowEx(0, "Static", "Pressure",
    WS_CHILD | WS_VISIBLE,
    11, 55, 95, 38, hwndMainWindow,
    (HMENU)Label1, hInstance, NULL);

SetWindowFont(hwnd_Label1, MSSansSerif_8pt, TRUE);

hwnd_Label2 = CreateWindowEx(0, "Static", "Temperature",
    WS_CHILD | WS_VISIBLE,
    11, 110, 95, 38, hwndMainWindow,
    (HMENU)Label2, hInstance, NULL);

SetWindowFont(hwnd_Label2, MSSansSerif_8pt, TRUE);

hwnd_TextBox1 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL,
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE,
    187, 55, 83, 35, hwndMainWindow,
    (HMENU)TextBox1, hInstance, NULL);

SetWindowFont(hwnd_TextBox1, MSSansSerif_8pt, TRUE);

hwnd_TextBox2 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL,
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE,
    187, 99, 83, 35, hwndMainWindow,
    (HMENU)TextBox2, hInstance, NULL);

SetWindowFont(hwnd_TextBox2, MSSansSerif_8pt, TRUE);

hwnd_CommandButton1 = CreateWindowEx(0, "Button", "CommandButton1",
    WS_CHILD | BS_MULTILINE | BS_PUSHBUTTON | WS_VISIBLE,
    308, 77, 117, 52, hwndMainWindow,
    (HMENU)CommandButton1, hInstance, NULL);


SetWindowFont(hwnd_CommandButton1, MSSansSerif_8pt, TRUE);

hwnd_TextBox3 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL,
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE,
    66, 220, 385, 35, hwndMainWindow,
    (HMENU)TextBox3, hInstance, NULL);

SetWindowFont(hwnd_TextBox3, MSSansSerif_8pt, TRUE);

return;
}



HWND GetItem(int nIDDlgItem)
{
switch(nIDDlgItem)
{
    case -1:
        return GetParent(hwnd_Label1);
    case Label1:
        return hwnd_Label1;
    case Label2:
        return hwnd_Label2;
    case TextBox1:
        return hwnd_TextBox1;
    case TextBox2:
        return hwnd_TextBox2;
    case CommandButton1:
        return hwnd_CommandButton1;
    case TextBox3:
        return hwnd_TextBox3;
    default: return NULL;
}
}



void Form_Unload(HWND hMainWnd)
{
DeleteFont(MSSansSerif_8pt);
return;
}

Я пытался много раз, но безуспешно. Даже если вы дадите мне ссылки на хорошие сайты, я буду благодарен.


person Santosh    schedule 02.08.2012    source источник
comment
собственно в чем вопрос?   -  person code-jaff    schedule 02.08.2012
comment
как сканировать значения из TEXTBOX1 и TEXTBOX2 при нажатии COMMANDBUTTON1 и отображать вывод в TEXTBOX3?   -  person Santosh    schedule 02.08.2012
comment
какой конструктор графического интерфейса вы используете?   -  person code-jaff    schedule 02.08.2012
comment
auto c , вот ссылка autoc.wolosoft.com   -  person Santosh    schedule 02.08.2012


Ответы (2)


Вы ищете хорошую книгу по программированию Win32 API с использованием C. И вам повезло, есть отличная книга, которую почти все используют для изучения. Он написан Чарльзом Петцольдом и называется (достаточно удачно) Программирование Windows. Вы хотите 5-е издание, которое является самой последней версией, в которой обсуждается программирование Win32.

В Интернете также доступны различные учебные пособия, если вы ищете «программирование Win32». Однако некоторые из них содержат некоторые ошибки и недоразумения (например, различие между строками ANSI и Unicode), а хорошие из них довольно короткие и неполные. Вы не узнаете все, что вам нужно знать, чтобы написать нетривиальную программу из онлайн-руководств, но вы сможете получить что-то действительно простое на экране. Этот файл от theForger мне много раз рекомендовали.

Имейте в виду, однако, что написание кода GUI (особенно на таком низком уровне), как правило, намного более многословно, чем просто вывод текста на экран для консольной программы. В конечном итоге вы напишете кучу кода, который используется только для работы графического интерфейса и не имеет ничего общего с логикой вашей программы. Гораздо проще, если вы сначала изучите язык C, и это лучше всего делать с помощью простых текстовых программ консольного типа.


Что касается вашего конкретного вопроса, вы создали на экране три элемента управления текстовыми полями с именами hwnd_TextBoxX, где X — число от 1 до 3. Как вы, вероятно, уже знаете, hwnd указывает дескриптор окна (wnd)< /em>, поэтому эти переменные содержат дескрипторы окон текстовых полей.

Win32 API предоставляет GetWindowText функцию, которую вы можете используйте для извлечения текста из определенного окна. Вы передаете ему дескриптор нужного окна (hWnd), указатель на буфер символов и целочисленное значение, указывающее длину вашего буфера. Уродливая природа языка C уже проявляется — вы должны понимать, как работают строки в C, чтобы правильно вызывать функцию.

Получив строку, отображаемую в одном из текстовых полей, вы можете отобразить ее в другом окне текстового поля, используя аналогичный SetWindowText, которая принимает только дескриптор окна (hWnd) и указатель на буфер, содержащий строку.

Код будет выглядеть примерно так:

// Get the text displayed in textbox 1
TCHAR szBuffer[100];
GetWindowText(hwnd_TextBox1, szBuffer, 100);

// Display that text in textbox 3
SetWindowText(hwnd_TextBox3, szBuffer);

Чтобы сделать это в ответ на нажатие кнопки, вам нужно узнать о Win32-эквиваленте «событий» — оконных сообщениях. Дочерние окна, как и элементы управления кнопками, отправляют уведомления в свое родительское окно (т. е. диалоговое окно), когда происходит что-то потенциально интересное, например, пользователь нажимает на них.

В частности, элемент управления "кнопка" отправляет своему родителю BN_CLICKED уведомление с помощью WM_COMMANDсообщения. Обработав сообщение WM_COMMAND в методе оконной процедуры главного окна (WndProc), вы можете проверить, соответствует ли параметр lParam дескриптору окна вашего элемента управления кнопкой (hWnd) и что HIWORD(wParam) соответствует коду уведомления BN_CLICKED.

Вам определенно нужна хорошая книга, содержащая пошаговые примеры кода для этого. Это слишком сложно подробно объяснить в ответе на переполнение стека.

person Cody Gray    schedule 02.08.2012
comment
спасибо, что написали... хотя я разработал основной функциональный код, который считывал значения паровой таблицы из файла .csv, я не знал кода графического интерфейса... и да... я также заказал книгу. - person Santosh; 02.08.2012

Написание приложения с графическим интерфейсом, использующего только Win32 API, несколько забавно, но также и утомительно. Гораздо проще использовать какой-либо фреймворк. Это не значит, что это невозможно. Вот краткий обзор того, как вы это делаете.

Во-первых, вы заменяете процедуру main на Главная Win. Эта подпрограмма является новой точкой входа вашего приложения. Он будет отвечать за создание окон и настройку цикла отправки сообщений.

Обратите внимание, что я сказал «окна», а не просто «окно». В WinAPI каждый «элемент управления», который вы видите в «форме», является «окном». Сама «форма» также является окном. Каждое окно имеет дескриптор окна (HWND). Вы можете создать окно приложения, используя СоздатьОкно. Это дает вам дескриптор окна, который вы можете передать функции CreateChildWindows, созданной для вас разработчиком графического интерфейса. Это добавит дочерние окна (элементы управления) в окно приложения.

Теперь нужно запрограммировать все эти окна. Вы делаете это, обрабатывая сообщения. Когда вы создаете окно приложения, вам необходимо предоставить оконную процедуру. Эта процедура будет реагировать на сообщения по мере их поступления. Например, нажатие кнопки приводит к появлению сообщения WM_COMMAND, которое вам придется обрабатывать. Последнее, что делает WinMain, — это запускает цикл обработки сообщений, который повторно вызывает ваш WndProc для любого входящего сообщения.

Все это начнет иметь смысл, когда вы проработаете учебник, указанный в другом ответе. Тогда вы, вероятно, устанете от этого и возьмете инструментарий GUI :)

person Greg Inozemtsev    schedule 02.08.2012
comment
Инструментарий GUI (пожалуйста, дайте мне несколько имен или ссылок)? Я использовал конструктор GUI, и этот код был сгенерирован автоматически. Но я думал о том, как совместить код GUI с функциональным кодом, который я написал. - person Santosh; 02.08.2012
comment
Я думал о чем-то вроде GTK+, инструментария с графическим интерфейсом более высокого уровня. У него также есть преимущество в том, что он кроссплатформенный, тогда как WinAPI привязывает вас к Windows. - person Greg Inozemtsev; 02.08.2012
comment
К сожалению, GTK+ заставит вас создавать совершенно ужасно выглядящие приложения для Windows. :-) - person Cody Gray; 02.08.2012