我用C语言开发了蒸汽表方程求解器......但是在黑屏控制台中输入值很无聊。
所以我非常想在C中创建简单的GUI。
我搜索了你好的世界代码,都很长。但这是我理解的唯一一个。
#include <windows.h>
int main()
{
MessageBoxA( NULL, "Hello World!", "Hello", MB_OK );
}
通过使用gui构建器来获取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;
}
我尝试了很多次,但都失败了。即使你们给我链接好的网站,我也会很高兴。
答案 0 :(得分:7)
你正在寻找一本关于使用C的Win32 API编程的好书。你很幸运,有一本很棒的书,几乎每个人都用来学习它。它是由查尔斯·佩佐尔德(Charles Petzold)编写的,它被称为(恰如其分)Programming Windows。您需要第5版,这是讨论Win32编程的最新版本。
如果您搜索“Win32编程”,还可以在线获得各种教程。但是,其中一些包含一些错误和误解(如ANSI和Unicode字符串之间的差异),而好的则包含一些错误和不完整的错误。你不会学到从在线教程中编写一个非平凡程序所需要知道的一切,但你应该能够在屏幕上看到一些非常简单的东西。 This one by theForger是我多次见过推荐的。
但请注意,编写GUI代码(特别是在如此低的级别)往往比简单地将文本添加到控制台程序的屏幕上更加冗长 lot 。您最终将编写一堆代码,这些代码仅用于使GUI工作,并且与程序的逻辑无关。如果您首先学习C语言会更容易,最好通过简单的控制台类型的纯文本程序来完成。
至于您的具体问题,您在屏幕上创建了三个文本框控件,名为hwnd_TextBoxX
,其中X
是1到3之间的数字。您可能已经知道,{{1表示窗口(wnd)的句柄,因此这些变量保存文本框窗口的句柄。
Win32 API提供GetWindowText
function,您可以使用它从特定窗口中检索文本。您将句柄传递给所需的窗口(hwnd
),指向字符缓冲区的指针以及指示缓冲区长度的整数值。 C语言的丑陋本质已经出现 - 您必须了解字符串在C中的工作方式才能正确调用函数。
一旦检索到其中一个文本框中显示的字符串,就可以使用类似的SetWindowText
function在另一个文本框窗口中显示它,该BN_CLICKED
notification仅使用窗口句柄(hWnd
)和指针到包含字符串的缓冲区。
代码看起来像这样:
hWnd
要执行此操作以响应单击按钮,您需要了解Win32等效的“事件”窗口消息。子窗口,如按钮控件,当发生可能有趣的事情时(例如用户点击它们),将通知消息发送到其父窗口(即对话框)。
特别是,按钮控件通过WM_COMMAND
message向其父级发送{{3}}。通过在主窗口的窗口过程(// 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);
)方法中处理WM_COMMAND
消息,您可以检查WndProc
参数是否与按钮控件的窗口句柄(lParam
)匹配,并且hWnd
与HIWORD(wParam)
通知代码相匹配。
你肯定需要一本好的书,其中包含该书的逐步示例代码。在Stack Overflow答案中彻底解释有点太难了。
答案 1 :(得分:1)
使用Win32 API编写GUI应用程序有点有趣,但也很乏味。使用某种框架要容易得多。这并不意味着它是不可能的。以下是您如何做到这一点的快速概述。
首先,用WinMain替换main
例程。此例程是应用程序的新入口点。它将负责创建窗口并设置消息调度循环。
请注意,我说的是“windows”而不只是“窗口”。在WinAPI中,您在“表单”上看到的每个“控件”都是一个“窗口”。 “形式”本身也是一个窗口。每个窗口都有一个窗口句柄(HWND
)。您可以使用CreateWindow创建应用程序窗口。这将为您提供一个窗口句柄,您可以将其传递给GUI构建器为您创建的CreateChildWindows
函数。这会将子窗口(控件)添加到应用程序窗口。
现在您需要对所有这些窗口进行编程。您可以通过处理消息来实现。创建应用程序窗口时,需要提供窗口过程。此过程将在消息进入时对其进行响应。例如,单击按钮会生成您必须处理的WM_COMMAND
消息。 WinMain
做的最后一件事就是启动一个消息处理循环,它会针对任何传入消息重复调用WndProc
。
一旦您完成另一个答案中链接的教程,这一切都将开始有意义。然后你可能会厌倦了这个并拿起一个GUI工具包:)