Windows窗体

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GodsLeft/article/details/50526501

匈牙利表示法

  • 在变量前添加表示变量类型的字母前缀,并继以一个大写字母开头的对变量的简短描述

    Item Value
    sz 指向一个以零字符结尾的字符串中的第一个字符
    str 字符串
    i int
    d double
    by byte
    l long
    p pointer
    lp long pointer
    n 数或int
    ui unsigned int
    c char
    w WORD(unsigned short)
    dw DWORD(unsigned long)
    fn 函数指针
    lpstr 指向字符串的long pointer
    h 句柄
    m_ 类成员
    g_ 全局类型
    hwnd 窗口句柄

    | hdc | Windows设备上下文(device context)的句柄 |

第一个窗口

  • 需要填充一个WNDCLASSEX 结构
WNDCLASSEX  winclass;
winclass.cbSize     = sizeof(WNDCLASSEX);
//这个赋值很重要,在下面create的时候,用
winclass.lpszClassName = g_szWindowClassName;
//...填充过程不写了

//注册window类
if(!RegisterClassEx(&winclass)){
    MessageBox(NULL, "Class Registation Failed!", "Error", 0);
    return 0;
}

hWnd = CreateWindowEx(NULL,
                      g_szWindowClassName,//这里和注册联系起来
                      g_szApplicationName,
                      WS_OVERLAPPENDWINDOW,
                      0,0,
                      WINDOW_WIDTH,
                      WINDOW_HEIGHT,
                      NULL,
                      NULL,
                      hInstance,//程序的实例句柄,从主函数传来
                      NULL);
//使窗口可见
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);

//在退出程序的时候,撤销注册的类
UnregisterClass(g_szWindowClassName, hInstance);

//---------------------------------------------------------
//-------------消息循环--------------------------------------
MSG msg;
while(GetMessage(&msg, NULL, 0, 0)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

bool bDone = false;
MSG msg;
while(!bDone){
    while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
        if(msg.message == WM_QUIT){
            bDone = true;
        }else{
            TranslateMessate(&msg);
            DispatchMessage(&msg);
        }
    }
    InvalidateRect(hWnd, NULL, TRUE);
    UpdateWindow(hWnd);
}
//---------------------------------------------------------
//---------------------------------------------------------

//------------绘图-------------------------
case WM_PAINT:{
    PAINTSTRUCT ps;
    HDC hdc;         //设备描述表

    //填充ps,返回hdc(= ps.hdc)
    hdc = BeginPaint(hwnd, &ps);
    //...
    EndPaint(hwnd, &ps);//这里自动释放了hdc
    return 0;
}

//======================================================
//函数原型
BOOL UnregisterClass(
    LPSTSTR    lpClassName,//注册时指定的名字
    HINSTANCE  hInstance
);
//创建窗口,函数原型
HWND CreateWindowEx(DWORD   dwExStyle,
                    LPCTSTR lpClassName,
                    LPCTSTR lpWindowName,
                    DWORD   dwStyle
                    int     x,
                    int     y,
                    int     nWidth,
                    int     nHeight,
                    HWND    hWndParent,
                    HMENU   hMenu,
                    HINSTANCE hInstance,
                    LPVOID  lpParam
                    );
  • 创建双缓冲
/* 创建一个与显示DC兼容的内存设备描述表,使用NULL作为参数的时候
 * 默认创建一个与当前屏幕兼容的DC。但当内存设备描述表被创建出来时
 * 它是单色的,并且宽度和高度各为一个像素,因此在开始使用时,要创建
 * 一张大小和格式与前置缓冲完全一致的位图,并利用selectObject函数
 * 将其选入内存DC
 */
HDC hdcBackBuffer = CreateCompatibleDC(NULL);

//创建位图
HDC hdc = GetDC(hwnd);
HBITMAP hBitmap = 
CreateCompatibleBitmap(hdc, cxClient, cyClient);

HBITMAP hOldBitmap = 
(HBITMAP)SelectObject(hdcBackBuffer, hBitmap);

//释放DC
ReleaseDC(hwnd, hdc);

/* -------使用后备缓冲--------------
 * 1.清除后备缓冲--通常采用背景色填充
 * 2.在后备缓冲的hdc绘图、写字
 * 3.将后备缓冲中的内容复制到前台缓冲
 */
//后备缓冲填充白色
BitBlt(hdcBackBuffer, 0, 0, cxClient, cyClient, NULL, NULL, NULL, WHITENESS);
//绘图...

//将后备缓冲区的内容传送到显示缓冲区
BitBlt(ps.hdc, 0, 0, cxClient, cyClient, hdcBackBuffer, 0, 0, SRCCOPY);



HBITMAP CreateCompatibleBitmap(
    HDC    hdc,       //DC句柄
    int    nWidth,    //
    int    nHeight
);

//BitBlt函数原型,通常用来将后备缓冲中的所有bit复制到显示内存区
BOOL BitBlt(
    HDC hdcDest,
    int nXDest,
    int nYDest,
    int nWidth,
    int nHeight,
    HDC hdcSrc,
    int nXSrc,
    int nYSrc,
    DWORD dwRop
);  
展开阅读全文

没有更多推荐了,返回首页