使用Windows API在C中编程:如何绘制命令按钮

时间:2011-04-11 10:21:38

标签: c windows winapi

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

我在这里遵循这个教程:http://www.winprog.org/tutorial/start.html并且非常好。 它解释了很多东西,但我找不到一件事(甚至搜索谷歌,但一切都是针对C ++或C#):

如何在绘制的窗口中绘制一个命令按钮(我已经学习过)以及如何接受它的事件?

您能否回答或指向一个很好的页面,该页面解释了如何使用Windows API和C来创建命令按钮。请不要使用C ++。

感谢您的时间! :)

2 个答案:

答案 0 :(得分:5)

This是我在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的原因是,如果您想在以后更改按钮,则需要将Handle作为SendMessage()的参数。现在,接下来,点击一下。单击该按钮时,它会在WM_COMMAND中将HMENU发送到父窗口,其中wParam已转换参数(在本例中为1)。这适用于您创建的每个控件(菜单,复选框等 - 如果它们发布了lParam中可能存在的更复杂的选项)。所以:

case WM_COMMAND:
    if (LOWORD(wParam) == 1) {
        DestroyWindow();
        /* or SendMessage(hwnd, WM_CLOSE,0,0); see commments */
    }
    break;

抓住那个特定的选择。在if处理该按钮事件。

答案 1 :(得分:1)

只需将CreateWindow与类名"BUTTON",样式BS_PUSHBUTTON和父窗口一起用作现有的绘制窗口即可。 x和y坐标选择窗口中的左上角按钮位置。窗口名称是按钮上的文本。另外,请记得在返回的句柄上调用ShowWindow

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

  

#define ID_MYBUTTON 1

然后将其传递给CreateWindow调用的menu-parameter。在主窗口消息proc中,您现在可以通过测试来找到消息:

  

if(message == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == ID_MYBUTTON) { /* button was clicked */ }