用windowsapi进行C编程:如何绘制命令按钮

用windowsapi进行C编程:如何绘制命令按钮,c,windows,winapi,C,Windows,Winapi,嗯,我正在用C构建一个大学项目。GUI还没有教过,但我希望我的程序更好,所以我正在学习Windows API 我在这里遵循这个教程:它非常好。 它解释了很多事情,但我找不到一件事(甚至搜索谷歌,但一切都面向C++或C): 如何在已绘制的窗口(我已学习)内绘制命令按钮,以及如何为其接受事件 你可以回答或指向一个好的页面,解释我如何使用Windows API和C++创建命令按钮。 谢谢你抽出时间!:) 只需将类名“BUTTON”、样式BS_BUTTON和父窗口用作现有的绘制窗口即可。x和y坐标选择窗

嗯,我正在用C构建一个大学项目。GUI还没有教过,但我希望我的程序更好,所以我正在学习Windows API

我在这里遵循这个教程:它非常好。 它解释了很多事情,但我找不到一件事(甚至搜索谷歌,但一切都面向C++或C):

如何在已绘制的窗口(我已学习)内绘制命令按钮,以及如何为其接受事件

<>你可以回答或指向一个好的页面,解释我如何使用Windows API和C++创建命令按钮。 谢谢你抽出时间!:)

只需将类名
“BUTTON”
、样式
BS_BUTTON
和父窗口用作现有的绘制窗口即可。x和y坐标选择窗口中左上角的按钮位置。窗口名称是按钮上的文本。另外,记住在返回的句柄上调用
ShowWindow

编辑:要接受它的事件,首先定义一个ID值,如:

#定义ID_MYBUTTON 1

然后将其传递到CreateWindow调用的菜单参数中。在主windows消息过程中,您现在可以通过测试以下各项来查找消息:

if(message==WM\u命令和HIWORD(wParam)==BN\u单击和LOWORD(wParam)==ID\u MYBUTTON){/*按钮被单击*/}

这是我极力推荐的关于Win32 API用户界面函数的教程。太棒了。粗略地说,在回调函数(
LRESULT callback-WndProc(HWND-HWND,UINT-msg,WPARAM-WPARAM,LPARAM-LPARAM)
中,您可以捕获以下几个选项:

switch(msg)  
{
    case WM_CREATE:
        break;

    case WM_COMMAND:
        break;
    /* .. */
}
您需要在
WM_CREATE
上执行以下操作:

HWND hWnd_button = CreateWindow(TEXT("button"), TEXT("Quit"),    
                 WS_VISIBLE | WS_CHILD ,
                 20, 50, 80, 25,        
                 hwnd, (HMENU) 1, NULL, NULL);  
我存储该按钮的
HWND
的原因是,如果您想在以后更改该按钮,您需要将该句柄作为
SendMessage()
的参数。现在,接下来,单击按钮。单击按钮时,它会将
WM_命令
发送到带有
meneu
强制参数的父窗口(1在本例中)在
wParam
中。这适用于您创建的每个控件(菜单、复选框等-如果它们发布更复杂的选项,它们可能出现在
lParam
)。因此:


捕获该特定选项。在
if
中处理该按钮事件。

您真正需要的是Charles Petzold的《编程窗口》。@David,谢谢您的建议。我刚刚深入API,如果我认为它对我有好处,我会得到这本书。只需继续遵循您找到的教程。我可以保证这是一个借口ellent教程。@tenfour好的,我会继续,然后转到NineFingers建议的第二个。谢谢你的建议。所以我必须为按钮创建一个新窗口?好的,这是新的东西。我要试试。谢谢你的快速回答。谢谢你指向那个优秀的教程。回答也很好!@Ishan没问题。宠物zold book是一本很好的书,我也推荐它,它涵盖了很多内容。但是,对于刚开始的教程来说,它是对基本内容的一个很好的介绍。PostQuitMessage并不是关闭窗口的正确方式,按钮应该发送WM\U close,或者如果您没有任何WM\U close处理(如果有未保存的更改等,则中止)您可以调用DestroyWindow,DestroyWindow最终发送WM_DESTROY,在那里您可以处理窗口的所有清理并调用PostQuitMessage@Anders我知道,但我是直接从教程中写出来的,因为这比在我实际完成这项工作的地方找到代码要快……为了完整性,我会修正它。
case WM_COMMAND:
    if (LOWORD(wParam) == 1) {
        DestroyWindow();
        /* or SendMessage(hwnd, WM_CLOSE,0,0); see commments */
    }
    break;