zoukankan      html  css  js  c++  java
  • WIN API下的窗口创建

    为了与MFC创建窗口的过程对照,也进行了一下WIN API下创建窗口的过程:
    话说:WIN API创建一个窗口的过程的确够烦的。

     1/*
     2  MFC 中创建窗口程序的过程:
     3  1:创建一个继承自CWinApp的应用程序类,并创建该类的全局实例。
     4  2:创建继承自WFrameWnd的窗口类
     5  3: 在窗口类中声明消息处理过程及声明消息映射
     6  4:  定义应用程序类,在其入口函数中指定应用程序主窗口。
     7  5: 定义窗口类,在其构造函数中创建窗口自身,并创建相关的控件。
     8  6: 在消息映射中加入需要处理的事件
     9  6: 实现窗口类的消息处理函数
    10
    11  而通过WINDOWS API创建的过程为:
    12   设计一个窗口类;
    13   注册窗口类;
    14   创建窗口;
    15   显示及更新窗口。
    16*/

    17#include <windows.h>
    18//独一无二的类名,一般用GUID字串,以免与其他程序的类名重复
    19//static const char * CLASS_NAME = L"{198CEAB2-AD78-4ed3-B099-247639080CB0}";
    20//消息处理方法预引用
    21LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    22
    23int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    24{
    25    WNDCLASS wndclass;
    26    wndclass.cbClsExtra=0;
    27    wndclass.cbWndExtra=0;
    28    wndclass.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_BTNFACE+1);
    29    wndclass.hCursor=LoadIcon(0, MAKEINTRESOURCE(IDI_WINLOGO));
    30    wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
    31
    32    wndclass.hInstance=hInstance;
    33    wndclass.lpfnWndProc=MyWndProc; //指定窗口的消息处理函数
    34    wndclass.lpszClassName=L"MyWindow";
    35
    36    wndclass.lpszMenuName=NULL;
    37    wndclass.style=CS_HREDRAW | CS_VREDRAW;
    38
    39    RegisterClass(&wndclass); //注册窗口类
    40    //创建窗口
    41    HWND hWnd=CreateWindow(L"XuZhiZe",L"McJeremy",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
    42    //显示窗口
    43    ShowWindow(hWnd,SW_SHOWNORMAL);
    44    UpdateWindow(hWnd);
    45
    46    //消息循环
    47    MSG msg;
    48    while(GetMessage(&msg,NULL,0,0))
    49    {
    50        //转换消息参数
    51        TranslateMessage(&msg);
    52        //分发消息
    53        DispatchMessage(&msg);
    54    }

    55    return 0;
    56}

    57
    58//实现消息处理函数
    59//该函数由应用程序定义,但不由应用程序调用
    60LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    61{
    62    switch(uMsg)
    63    {
    64        case WM_LBUTTONDOWN:
    65            MessageBox(hWnd,L"mouse clicked",L"asdfasdf",0);
    66            HDC hdc;
    67            hdc=GetDC(hWnd); //GetDC获取当前窗口的设备上下文,不加参数,则是整个屏幕的设备上下文
    68            TextOut(hdc,0,50,L"asdfasdf",strlen("asdfdfasdf"));
    69            ReleaseDC(hWnd,hdc); //通过GetDC(),GetWindowDC()获取的DC,需要ReleaseDc()来释放
    70            //而通过CreateDC(),CreateWindowDC()创建的,需要用DeleteDC()来释放
    71            break;
    72        case WM_CLOSE:
    73            if(IDYES==MessageBox(hWnd,L"end?",L"xxx",MB_YESNO))
    74            {
    75                DestroyWindow(hWnd);
    76            }

    77            break;
    78        case WM_DESTROY:
    79            PostQuitMessage(0); //如果是“窗口销毁”事件,则应该在消息队列中投递
    80            break;
    81        default:
    82            return DefWindowProc(hWnd,uMsg,wParam,lParam); 
    83    }

    84    return 0;
    85}
  • 相关阅读:
    vue中处理ie兼容性问题
    vue使用websocket
    vue-cli中使用sass的坑
    really_probe()
    ro.boot.bootreason property设置(androidboot.xxxx bootargs)
    kernel exception vector table
    compile/link misc
    user space syscall/library API misc
    LIUNX SHELL中-a 到-z的解释
    getenforce/setenforce
  • 原文地址:https://www.cnblogs.com/McJeremy/p/1445513.html
Copyright © 2011-2022 走看看