首页 > 软件开发 > C语言 >

C语言编写Windows下的实用程序:[3]窗口

来源:互联网 2023-03-16 19:12:09 375

前面两篇,我们只是通过Windows系统的MessageBox函数,简单做出了一个提示对话框,这对我编写实用的窗口程序是远远不够的,这篇开始,我们来介绍下怎样用C语言开发Windows下的窗口程序。lMI办公区 - 实用经验教程分享!

工具/原料

  • Windows
  • VS 2010

方法/步骤

  • 1

    打开VS2010,建立Win32项目SimpleWindow。lMI办公区 - 实用经验教程分享!

    C语言编写Windows下的实用程序:[3]窗口lMI办公区 - 实用经验教程分享!

  • 2

    设置项目为"空白项目",从而不让VS2010为我们生成代码。lMI办公区 - 实用经验教程分享!

    C语言编写Windows下的实用程序:[3]窗口lMI办公区 - 实用经验教程分享!

  • 3

    在项目中添加"SimpleWindow.cpp"文件。lMI办公区 - 实用经验教程分享!

    C语言编写Windows下的实用程序:[3]窗口lMI办公区 - 实用经验教程分享!

  • 4

    这里我们要介绍几个Windows的函数,首先是RegisterClassEx函数。lMI办公区 - 实用经验教程分享!

    该函数注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。 RegisterClass函数己经由函数RegisterClassEx函数来代替,但是,如果不需要设置类的小目标则仍然可以使用RegisterClass函数。lMI办公区 - 实用经验教程分享!

    可以参见微软的msdn。lMI办公区 - 实用经验教程分享!

    C语言编写Windows下的实用程序:[3]窗口lMI办公区 - 实用经验教程分享!

  • 5

    CreateWindowEx函数:lMI办公区 - 实用经验教程分享!

    该函数创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口,其他与CreateWindow函数相同。关于创建窗口和其他参数的内容,请参看CreateWindow。具体仍可见微软的msdn。lMI办公区 - 实用经验教程分享!

    C语言编写Windows下的实用程序:[3]窗口lMI办公区 - 实用经验教程分享!

  • 6

    消息处理函数WindowProc:lMI办公区 - 实用经验教程分享!

    该函数是一个应用程序定义的函数。它处理发送给窗口的消息。WINDPROC类型定义了一个指向该回调函数的指针。WindowProc是用于应用程序定义函数的占位符。lMI办公区 - 实用经验教程分享!

    函数原型:lMI办公区 - 实用经验教程分享!

    LRESULT CALLBACK WindowProc (HWND hwnd,lMI办公区 - 实用经验教程分享!

    UINT uMsg,lMI办公区 - 实用经验教程分享!

    WPARAM wParam,lMI办公区 - 实用经验教程分享!

    LPARAM lParam);lMI办公区 - 实用经验教程分享!

    参数:lMI办公区 - 实用经验教程分享!

    hwnd:指向窗口的句柄。lMI办公区 - 实用经验教程分享!

    uMsg:指定消息类型。lMI办公区 - 实用经验教程分享!

    wParam:指定其余的、消息特定的信息。该参数的内容与UMsg参数值有关。lMI办公区 - 实用经验教程分享!

    IParam:指定其余的、消息特定的信息。该参数的内容与uMsg参数值有关。lMI办公区 - 实用经验教程分享!

    返回值:返回值就是消息处理结果,它与发送的消息有关。lMI办公区 - 实用经验教程分享!

    速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0 以上版本;头文件:winuser.h;库文件:用户自定义。lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    我们这里的窗口处理函数,如图所示,并没有做太多工作,而只是做了简单的消息处理。lMI办公区 - 实用经验教程分享!

    C语言编写Windows下的实用程序:[3]窗口lMI办公区 - 实用经验教程分享!

  • 7

    最终SimpleWindow的代码如下:lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    #include Windows.h>lMI办公区 - 实用经验教程分享!

    #include tchar.h>lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    int WinMain(lMI办公区 - 实用经验教程分享!

    __in HINSTANCE hInstance,lMI办公区 - 实用经验教程分享!

    __in_opt HINSTANCE hPrevInstance,lMI办公区 - 实用经验教程分享!

    __in LPSTR lpCmdLine,lMI办公区 - 实用经验教程分享!

    __in int nShowCmdlMI办公区 - 实用经验教程分享!

    )lMI办公区 - 实用经验教程分享!

    {lMI办公区 - 实用经验教程分享!

    TCHAR *szName = _T("myWindow");lMI办公区 - 实用经验教程分享!

    WNDCLASSEX wc = {0};lMI办公区 - 实用经验教程分享!

    HWND hWnd = NULL;lMI办公区 - 实用经验教程分享!

    MSG Msg = {0};lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    wc.cbClsExtra = 0;lMI办公区 - 实用经验教程分享!

    wc.cbWndExtra = 0;lMI办公区 - 实用经验教程分享!

    wc.cbSize = sizeof(WNDCLASSEX);lMI办公区 - 实用经验教程分享!

    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//通过函数来设置一个白色的背景,这里大家设置为NULL看看,会很有趣的lMI办公区 - 实用经验教程分享!

    wc.hCursor = NULL;//不设置lMI办公区 - 实用经验教程分享!

    wc.hIcon = NULL;//不设置lMI办公区 - 实用经验教程分享!

    wc.hIconSm = NULL;//不设置lMI办公区 - 实用经验教程分享!

    wc.hInstance = hInstance;//当前程序的句柄,hInstance是有系统给传递的lMI办公区 - 实用经验教程分享!

    wc.lpfnWndProc = WinProc;//窗口处理过程的回调函数。lMI办公区 - 实用经验教程分享!

    wc.lpszClassName = szName;//窗口类的名字。lMI办公区 - 实用经验教程分享!

    wc.lpszMenuName = NULL;lMI办公区 - 实用经验教程分享!

    wc.style = CS_HREDRAW | CS_VREDRAW;lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    RegisterClassEx(&wc);//在系统中注册lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,szName,_T("我的窗口我喜欢"),WS_OVERLAPPEDWINDOW,lMI办公区 - 实用经验教程分享!

    200,100,600,400,NULL,NULL,hInstance,NULL);//创建窗口,窗口标题为"我的窗口我喜欢"lMI办公区 - 实用经验教程分享!

    if(hWnd == NULL)lMI办公区 - 实用经验教程分享!

    {lMI办公区 - 实用经验教程分享!

    MessageBox(NULL,_T("There's an Error"),_T("Error Title"),MB_ICONEXCLAMATION|MB_OK);lMI办公区 - 实用经验教程分享!

    return 0;lMI办公区 - 实用经验教程分享!

    }lMI办公区 - 实用经验教程分享!

    ShowWindow(hWnd,nShowCmd);//显示窗口lMI办公区 - 实用经验教程分享!

    UpdateWindow(hWnd);lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    //下面是对消息的循环处理,大家先不必管这些,下节课我会细说的lMI办公区 - 实用经验教程分享!

    while(GetMessage(&Msg,NULL,0,0))lMI办公区 - 实用经验教程分享!

    {lMI办公区 - 实用经验教程分享!

    TranslateMessage(&Msg);//翻译消息lMI办公区 - 实用经验教程分享!

    DispatchMessage(&Msg);//分派消息lMI办公区 - 实用经验教程分享!

    }lMI办公区 - 实用经验教程分享!

    return Msg.message;lMI办公区 - 实用经验教程分享!

    }lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    //消息处理函数lMI办公区 - 实用经验教程分享!

    LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)lMI办公区 - 实用经验教程分享!

    {lMI办公区 - 实用经验教程分享!

    switch(Msg)//处理消息过程lMI办公区 - 实用经验教程分享!

    {lMI办公区 - 实用经验教程分享!

    case WM_DESTROY://响应鼠标单击关闭按钮事件lMI办公区 - 实用经验教程分享!

    PostQuitMessage(0);//退出消息队列lMI办公区 - 实用经验教程分享!

    return 0;//退出函数lMI办公区 - 实用经验教程分享!

    }lMI办公区 - 实用经验教程分享!

    return DefWindowProc(hWnd,Msg,wParam,lParam);lMI办公区 - 实用经验教程分享!

    }lMI办公区 - 实用经验教程分享!

    lMI办公区 - 实用经验教程分享!

    编译链接后,得到如图中所示,可以看到我们自己的窗口程序就出来了。lMI办公区 - 实用经验教程分享!

    C语言编写Windows下的实用程序:[3]窗口lMI办公区 - 实用经验教程分享!

  • 7本页面未经许可获取自百度经验
  • 注意事项

    • 初学者,要多阅读相关文章,了解Windows系统的消息机制。
    对话框

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!lMI办公区 - 实用经验教程分享!


    标签: C语言

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码