Windows窗体

匈牙利表示法

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

    ItemValue
    sz指向一个以零字符结尾的字符串中的第一个字符
    str字符串
    iint
    ddouble
    bybyte
    llong
    ppointer
    lplong pointer
    n数或int
    uiunsigned int
    cchar
    wWORD(unsigned short)
    dwDWORD(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
);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值