码迷,mamicode.com
首页 > 其他好文 > 详细

第三章、窗口与消息

时间:2015-03-16 19:08:55      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

  应用程序的每个窗口都有一个窗口过程函数与之关联,Windows通过调用窗口过程向窗口传递消息。窗口过程依据消息做相应处理,然后将控制权返还给Windows。

  窗口类标识了用于处理传递给窗口的消息的窗口过程,允许多个窗口共享同一窗口类。

  消息队列中存放着应用程序可能创建的所有窗口的消息,消息循环从消息队列中检索消息,并将其分发给相应的窗口过程。

#include <Windows.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HWND hwnd;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("HelloWin");
    
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);                //加载图标,以供程序使用
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);                    //加载鼠标光标,以供程序使用
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);    //获取一个图形对象,本例中用来对窗口的背景进行重绘的画刷。
    wndclass.lpszClassName = szAppName;            
    wndclass.lpszMenuName = NULL;

    if(!RegisterClass(&wndclass))                                    //为应用程序的窗口注册一个窗口类
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),szAppName, MB_ICONERROR);//显示消息框
        return 0;
    }

    hwnd = CreateWindow(szAppName,
                        TEXT("The Hello Program"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);                                        //基于窗口类创建一个窗口

    ShowWindow(hwnd, iCmdShow);                                        //在屏幕中显示窗口
    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)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    switch(message)
    {
    case WM_CREATE:
        PlaySound(TEXT("hellowin.wav"),NULL,SND_FILENAME | SND_ASYNC);//播放声音文件
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd,&ps);                                    //标明窗口绘制开始
        GetClientRect(hwnd,&rect);                                    //获取窗口客户区的尺寸
        DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);//显示一个文本字符串
        EndPaint(hwnd,&ps);                                            //结束窗口绘制
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);                                            //将“退出”消息插入消息队列
        return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);                //执行默认的消息处理
}

 

前缀 常量
CS 类风格选项
CW 创建窗口选项
DT 文本绘制选项
IDI 图标的ID号
IDC 光标的ID号
MB 消息框选项
SND 声音选项
WM 窗口消息
WS 窗口风格

UINT:unsigned int; WPARAM: unsigned ing; LPARAM:long。

WINAPI和CALLBACK定义为__stdcall,制定了Windows和应用程序之间函数调用的次序。

                                四种结构:

结构 含义
MSG 消息结构
WNDCLASS 窗口类结构
PAINTSTRUCT 绘制结构
RECT 矩形结构

  句柄本质上是引用某个对象的数值,应用程序通过在其他Windows函数中使用句柄来引用相应对象。

标识符 含义
HINSTANCE 实例句柄--程序本身
HWND 窗口句柄
HDC 设备环境句柄

   匈牙利标记法:变量名以表明该变量数据类型的小写字母开始。

前缀 数据类型
c char或WCHAR或TCHAR
by BYTE(无符号字符)
n short(短整型)
i int(整型)
x,y int,表示x坐标和y坐标
cx,cy int,表示x或y的长度,c表示count(计数)
B或f BOOL(int);f表示flag
w WORD(无符号短整型)
l LONG(长整型)
dw DWORD(无符号长整型)
fn 函数
s 字符串
sz 以零结束的字符串
h 句柄
p 指针

 

第三章、窗口与消息

标签:

原文地址:http://www.cnblogs.com/gongyan/p/4342527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!