调用MFC建立窗口进行绘制的极简版(for greenhands)——单文件

代码如下,有注解。

调试相关,需要自行链接MFC库,引用一下【设置】【连接器】里的对象库模块

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

同时需要注意,在工程选项中,将/subsystem:console改成/subsystem:windows

在微软编译器下,可以跑通。很有爱的简洁版,出自《opengl编程精粹》

 

#include <windows.h>

static LPCTSTR lpszAppName = "GDI App";

HBRUSH hBlueBrush, hRedBrush;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;        //消息结构
    WNDCLASS wc;    //窗口类型结构
    HWND hWnd;        //窗口句柄

    hBlueBrush = CreateSolidBrush(RGB(0, 0, 255));
    hRedBrush = CreateSolidBrush(RGB(255, 0, 0));

    //定义窗口类型
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);

    //填充
    wc.hbrBackground = hBlueBrush;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = lpszAppName;

    //注册窗口类型
    if(RegisterClass(&wc) == 0)
        return FALSE;

    //创建应用主窗口
    hWnd = CreateWindow(
                            lpszAppName,
                            lpszAppName,
                            WS_OVERLAPPEDWINDOW,
                            100, 100,
                            250, 250,
                            NULL,
                            NULL,
                            hInstance,
                            NULL           
        );

    //若创建失败,则退出
    if(hWnd == NULL)
        return FALSE;

    //显示窗口
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    //启动消息循环,直至窗口被关闭
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        //分发消息至相应的窗口的消息处理回调函数
        DispatchMessage(&msg);
    }


    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        //程序结束
    case WM_DESTROY:
            PostQuitMessage(0);
            break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HBRUSH hOldBrush;

            //开始绘图
            BeginPaint(hWnd, &ps);

            //选用红色
            hOldBrush = (HBRUSH)SelectObject(ps.hdc, hRedBrush);
            Rectangle(ps.hdc, 100, 100, 150, 150);

            //回复以前画刷
            SelectObject(ps.hdc, hOldBrush);

            //结束绘制
            EndPaint(hWnd, &ps);
        }
        break;
    default:
        //将为处理的消息交与Windows默认的处理函数处理
        return(DefWindowProc(hWnd, message, wParam, lParam));
    }
    return(0L);
}

posted on 2012-04-12 19:38  林子好  阅读(418)  评论(0编辑  收藏  举报

导航