文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Windows编程 最简单的窗口实例

Windows编程 最简单的窗口实例

时间:2010-11-05  来源:kgisme170

        从0开始写一个WinMain函数,要显示一个窗口,必须有非空的WndProc来处理WM_PAINT(这个是UpdateWindow发出的指令)。需要注意的是:
1. WinMain可以什么窗口也没有,而只是一个后台程序.
2. wndproc不能什么代码也没有,否则CreateWindowEx失败.
3. 在BeginPaint和EndPaint之间添加绘图代码。MFC封装的CPaintDC在ctor和dtor里面分别调用了这两个函数。
4. wnd.hCursor=LoadCursor(NULL,IDC_ARROW);//如果不指定的话,默认的光标就是沙漏
5. 如果没有这个while消息处理循环,那么一运行显示窗口,成就就会Abort.
6. 如果没有TranslateMessage和DispatchMessage,窗口消息就会一直停留在消息队列里面,死循环。
源代码:

#include<Windows.h>
#include<stdio.h>
const char className[]="mywndclass";
LRESULT __stdcall myproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message){
    case WM_COMMAND:// 菜单选择:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
        {
    //        case IDM_ABOUT:
    //        ... ...
    //            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        //在此添加任意绘图代码...,使用hDC=GetHDC(hWnd)
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0L;
}
int __stdcall WinMain(
    HINSTANCE hInst,
    HINSTANCE hPrev,
    LPSTR lpCmdLine,
    int nCmdShow
){
    WNDCLASSEX wnd;
    ZeroMemory(&wnd,sizeof(wnd));
    wnd.cbSize=sizeof(wnd);
    wnd.style=CS_HREDRAW | CS_VREDRAW;
    wnd.lpszClassName=className;
    wnd.lpszMenuName =NULL;
    wnd.hInstance =hInst;
    wnd.lpfnWndProc =myproc;
    wnd.hIcon =LoadIcon(NULL, IDI_APPLICATION);
    wnd.hCursor =LoadCursor(NULL,IDC_ARROW);
    wnd.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
    ATOM reg;
    if((reg=RegisterClassEx(&wnd))==0){
        MessageBox(NULL,"RegisterClassEx失败\n","有错!",MB_OK);
        return 1;
    }
    char dip[200];
    HWND hWnd=CreateWindowEx(0,className,"窗口名称",
        WS_OVERLAPPEDWINDOW|WS_HSCROLL |WS_VSCROLL,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        NULL,NULL,hInst,NULL);
    if(!IsWindow(hWnd)){
        sprintf(dip,"CreateWindowEx失败:%d\n",GetLastError());
        MessageBox(NULL,dip,"有错!",MB_OK);
        return 1;
    }
    ShowWindow(hWnd,SW_SHOW);
    UpdateWindow(hWnd);
    MSG msg;
    while (GetMessage(&msg, (HWND) NULL, 0, 0) != 0 && GetMessage(&msg, (HWND) NULL, 0, 0) != -1) {
        TranslateMessage(&msg);//例如WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR,可以没有这句
        DispatchMessage(&msg); //调用myproc以DefWindowProc结束,清理队列。
    }
    return (int)msg.wParam;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载