【问题标题】:simple c programming gui简单的 c 编程 gui
【发布时间】:2012-07-31 00:35:42
【问题描述】:

我用C语言开发了蒸汽表方程求解器...但是在黑屏控制台中输入值很无聊。

所以我非常想用 C 创建简单的 GUI。

我搜索了 hello world 代码,都很长。但这是我唯一理解的。

#include <windows.h>

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

通过使用 C 的 gui 构建器,我得到了这段代码,现在我正在考虑如何在 单击 COMMANDBUTTON1扫描 TEXTBOX1 和 TEXTBOX2 中的值在 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;
}

我尝试了很多次,但都失败了。即使你们给我好网站的链接,我也会很感激的。

【问题讨论】:

  • 究竟是什么问题?
  • 如何在点击 COMMANDBUTTON1 时扫描 TEXTBOX1 和 TEXTBOX2 中的值并在 TEXTBOX3 中显示输出?
  • 您使用的 GUI builder 是什么?
  • auto c ,这里是链接autoc.wolosoft.com

标签: c user-interface button textbox win32gui


【解决方案1】:

您正在寻找一本关于使用 C 进行 Win32 API 编程的好书。您很幸运,有一本很棒的书,几乎每个人都用来学习它。它是由 Charles Petzold 编写的,它被称为(恰当地)Programming Windows。您想要第 5 版,这是讨论 Win32 编程的最新版本。

如果您搜索“Win32 编程”,也可以在线获得各种教程。但是,其中一些包含一些错误和误解(例如 ANSI 和 Unicode 字符串之间的差异),而好的则相当短且不完整。您不会从在线教程中学到编写一个重要程序所需的所有知识,但您应该能够在屏幕上获得一些非常简单的东西。 This one by theForger 是我多次推荐的。

但请注意,编写 GUI 代码(尤其是在如此低的级别)往往比简单地将文本显示到控制台程序的屏幕上更冗长很多。您最终将编写一堆代码,这些代码仅用于使 GUI 工作,与您的程序逻辑无关。如果您先学习 C 语言会容易得多,而且最好通过简单的控制台类型的纯文本程序来完成。


至于您的具体问题,您在屏幕上创建了三个文本框控件,名为hwnd_TextBoxX,其中X 是一个介于1 和3 之间的数字。您可能已经知道,hwnd 表示一个 窗口句柄 (wnd),因此这些变量持有文本框窗口的句柄。

Win32 API 提供了GetWindowText function,您可以使用它从特定窗口中检索文本。您将一个句柄传递给所需的窗口 (hWnd)、一个指向字符缓冲区的指针以及一个指示缓冲区长度的整数值。 C 语言的丑陋特性已经出现了——您必须了解字符串在 C 中是如何工作的,才能正确调用函数。

一旦您检索到显示在其中一个文本框中的字符串,您可以使用类似的SetWindowText function 将其显示在另一个文本框窗口中,它只需要窗口句柄 (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 中的“事件”等价物——窗口消息。子窗口(例如按钮控件)会在发生可能有趣的事情(例如用户单击它们)时向其父窗口(即对话框)发送通知消息。

特别是,按钮控件通过WM_COMMAND message 向其父级发送BN_CLICKED notification。通过在主窗口的窗口过程 (WndProc) 方法中处理 WM_COMMAND 消息,您可以检查 lParam 参数是否匹配按钮控件的窗口句柄 (hWnd) 以及 HIWORD(wParam) 是否匹配 @987654342 @通知代码。

您肯定需要一本好书,其中包含该示例的分步示例代码。在 Stack Overflow 答案中彻底解释有点太难了。

【讨论】:

  • 感谢您的写作……虽然我开发了从 .csv 文件中读取蒸汽表值的主要“功能代码”,但我不知道 GUI 代码……嗯……我也订购了这本书。
【解决方案2】:

仅使用 Win32 API 编写 GUI 应用程序有些有趣,但也很乏味。使用某种框架要容易得多。但这并不意味着它是不可能的。以下是您如何执行此操作的简要概述。

首先,将main 例程替换为WinMain。此例程是应用程序的新入口点。它将负责创建窗口并设置消息分发循环。

请注意,我说的是“窗口”,而不仅仅是“窗口”。在 WinAPI 中,您在“窗体”上看到的每个“控件”都是一个“窗口”。 “表格”本身也是一个窗口。每个窗口都有一个窗口句柄 (HWND)。您可以使用CreateWindow 创建一个应用程序窗口。这将为您提供一个窗口句柄,您可以将其传递给 GUI 构建器为您创建的 CreateChildWindows 函数。这会将子窗口(控件)添加到应用程序窗口。

现在您需要对所有这些窗口进行编程。您可以通过处理消息来做到这一点。当您创建应用程序窗口时,您需要提供一个窗口过程。此过程将在消息进入时对其进行响应。例如,单击按钮会生成您必须处理的WM_COMMAND 消息。 WinMain 所做的最后一件事是启动一个消息处理循环,该循环重复调用您的 WndProc 以获取任何传入消息。

一旦您完成了另一个答案中链接的教程,这一切都将开始变得有意义。然后你可能会厌倦这个并拿起一个 GUI 工具包:)

【讨论】:

  • GUI 工具包(请给我一些名称或链接)?我使用了 GUI 构建器,这段代码是自动生成的。但我在考虑如何将 GUI 代码与我编写的功能代码结合起来。
  • 我在考虑类似 GTK+ 的东西,它是一个更高级别的 GUI 工具包。它还具有跨平台的优势,而 WinAPI 会将您绑定到 Windows。
  • 不幸的是,GTK+ 会束缚您创建看起来非常糟糕的 Windows 应用程序。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多