win32-创建界面

1.创建空工程

2.设为启动项目

 

 3.设置字符集

右击工程-->属性

 

 

 

 

4.添加新建项

右击工程-->新建项

 

 

5.代码

#include<windows.h>                                //win32程序需要包含<windows.h>
#include<TCHAR.h>                                 //程序中使用了TCHAR类型,因此需要包含<TCHAR.h>
static TCHAR szWindowClass[] = _T("WindowClass"); //窗口类名
static TCHAR szTitle[] = _T("我的窗口程序");      //窗口标题

//2.定义窗口处理函数[自定义,用来处理消息的]
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//CALLBACK代表这个函数是回调函数,也就是作为主函数的参数(这里是在注册窗口时作为WNDCLASSEX声明的wcex的成员被主函数调用
//WindowProc 是函数名,可以自定义
//参数1:窗口句柄
//参数2:消息ID
//参数3和参数4:是消息附加数据
{
    
    switch (uMsg) //接收第四步DispatchMessage()发出得消息或者系统直接发出的消息
    {
    case  WM_DESTROY://接到DispatchMessage()发来WM_DESTROY消息
        PostQuitMessage(0);//通知系统进程中止退出
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);//由系统默认处理的其它消息
        break;
    }

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)    
//入口函数
//参数1:当前程序实例句柄
//参数2:前一个程序的实例句柄
//参数3:命令行字符串
//参数4:显示方式
{
    //第一步:注册窗口类
    WNDCLASSEX wx = { 0 }; //注意:1.注册的窗口类并不直接显示;
                             //      2.WNDCLASSEX成员很多,先赋值0;
                             //      3.赋值0后,除下面必要的给成员赋值外,其余赋值0的
                             //        均自动使用默认值。
    wx.cbSize = sizeof(WNDCLASSEX);  //因适应不同操作系统版本需要,必须如此赋值不能缺省。
    wx.lpfnWndProc = WindowProc;     //回调函数(在第五步实现),我们的显示内容在回调函数中实现
    wx.lpszClassName = szWindowClass;//窗口类名
    if (!RegisterClassEx(&wx))  //向系统注册
    {
        MessageBox(NULL, _T("注册窗口失败"), _T("Caption"), NULL);
    }

    //第二步:创建窗口
    HWND hWnd = CreateWindow(szWindowClass,szTitle,  WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500, 300,NULL,NULL,hInstance,NULL);   //创建窗口
    //参数1:窗口类名
    //参数2:窗口标题
    //参数3:窗口样式
    //参数4和参数5:窗口坐标;CW_USEDEFAULT是缺省值
    //参数6和参数7:窗口宽和高
    //参数8:父窗口句柄
    //参数9:菜单句柄
    //参数10:当前程序实例句柄
    //参数11:附加数据;指向一个值的指针,该值传递给窗口 WM_CREATE 消息
    //返回值:窗口句柄,失败返回NULL

    if (!hWnd)
    {
        MessageBox(NULL, _T("创建窗口失败"), _T("Tip"), NULL);
        return 1;
    }


    //第三步:显示窗口
    ShowWindow(hWnd, nCmdShow);//将窗口在屏幕上显示出来
    //参数1:窗口句柄
    //参数2:显示方式



    //第四步:开始消息循环
    MSG msg = { 0 };//声明一个
    while (GetMessage(&msg, NULL, 0, 0))     //从系统消息队列里获得消息
    //作用:GetMessage是从调用线程的消息队列里取得一个消息并将其放于指定的结构
    //      此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息
    //      GetMessage不接收属于其他线程或应用程序的消息
    //      获取消息成功后,线程将从消息队列中删除该消息。函数会一直等待直到有消息到来才有返回值
    //参数1:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息
    //参数2:取得其消息的窗口句柄(HWND)。
    //       当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息
    //       线程消息通过PostThreadMessage寄送给调用线程
    //参数3:UINT wMsgFilterMin指定被检索的最小消息值的整数
    //参数4:UINT wMsgFilteMax指定被检索的最大消息值的整数
    //       如果参数3和参数4都为零,GetMessage获取所有可得的消息(即,无范围过滤)
    //       常数 WM_KEYFIRST和WM_KEYAST可作为过滤值取得与键盘输入相关的所有消息
    //       常数WM_MOUSEFIRST和WM_MOUSELST可用来接收所有的鼠标消息
    //返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值;如果函数取得WM_QUIT消息,返回值是零
    //        如果出现了错误,返回值是-1
    //GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕
    {
        TranslateMessage(&msg);
        //作用:函数功能:该函数将虚拟键消息(快捷键消息)转换为字符消息。
        //参数:指向含有消息的MSG结构的指针,该结构里含有用函数GetMessage或PeekMessage从调用线程的消息队列里取得的消息信息
        // 返回值:如果消息被转换(即字符消息被寄送到调用线程的消息队列里),返回非零值。
        //         如果消息是WM_kEYDOWN,WM_KEYUP WM_SYSKEYDOWN或WM_SYSKEYUP,返回非零值,不考虑转换。
        //         如果消息没被转换(即字符消息没被寄送到调用线程的消息队列里),返回值是零。
        //说明:由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。
        //     字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,
        //     系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数( wParam和 lParam)包含的是 虚拟键代码和扫描码等信息,
        //    而我们在程序中往往需要得到某个字符的ASCII码,TranslateMessage这个函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合
        //    转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息队列中
        //   注意,TranslateMessage函数并不会修改原有的消息,它只是产生新的消息并投递到消息队列中。
        //   也就是说TranslateMessage会发现消息里是否有字符键的消息,如果有字符键的消息,就会产生WM_CHAR消息,如果没有就不会产生什么消息
        //备注:WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息
        //      WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR消息
        //      TranslateMessage为那些由键盘驱动器映射为ASCll字符的键产生WM_CHAR消息
        //      如果应用程序为其他用途处理虚拟键消息,不应调用TranslateMessage。例如,如果调用TranslateAccelerator返回一个非零值,应用程序不应调用TranslateMessage
        //      TranslateMessage只能用于转换调用GetMessage或PeekMessage接收的消息
        DispatchMessage(&msg); //分发消息
        //函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的
        //          它根据msg结构中的hWnd窗口句柄成员找到相应的窗口类 ,然后根据注册窗口时wndclass类结构找到相应的窗口函数WndPorc()。由消息传递函数将消息传递给窗口函数WndPorc()进行消息处理
        //参数:指向含有消息的MSG结构的指针
        //返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略
    }
    return (int)msg.wParam;//通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
}

 

示例工程:

链接:https://pan.baidu.com/s/1mmqoNcK7CFVGxGf5MCqljQ       提取码:6666

 

 

 

 

 

posted @ 2022-12-13 07:35  天子骄龙  阅读(116)  评论(0编辑  收藏  举报