第三章、窗口与消息

  应用程序的每个窗口都有一个窗口过程函数与之关联,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 指针
时间: 2024-08-06 07:55:31

第三章、窗口与消息的相关文章

第27章 窗口与消息(1)

27.1 线程的消息队列 (1)Windows用户对象(User Object) ①类型:图标.光标.窗口类.菜单.加速键表等 ②当一个线程创建某个对象时,则该对象归这个线程的进程所有,当进程结束时,如果用户没有明确删除这个对象,则操作系统会自动删除这个对象. ③窗口和钩子(hook)这两种用户对象,它们分别由建立窗口和安装钩子的线程所拥有(注意,不是进程).如果一个线程建立一个窗口或安装一个钩子.然后线程结束,操作系统会自动删除窗口或卸载钩子. ④窗口及线程的拥有关系使得建立窗口的线程必须为它

《Windows程序设计 第5版》第3章 窗口与消息 笔记

广告先: LibUIDK界面库:制作QQ.360界面时,你能找到的最强大的界面库.基于DirectHWND技术! 3.1 窗口的创建 一个简单的win32程序如下(假设工程名为"HelloWin32",下面的代码是使用vc6.0创建一个名为HelloWin32的"Win32 Application",并且选择"A typical "Hello World" application"后创建的代码精简后得到): // HelloW

第3章 窗口与消息_3.2面向对象的窗口类的封装

3.2.1 MFC单文档大致框架 (1)MFC类继承略图 (2) MFC单文档应用程序类层次结构图 CWinApp:应用程序类,每个应用程序有且只有一个继承于CWinApp的派生类对象 CWnd:是一个通用的窗口类,用于提供Windows中的所有通用特性.对话框和控件. (3)应用程序执行过程图 3.2.2 应用程序QWinApp的设计 //QWinApp.h文件 #include "stdAfx.h" class QWinApp { public: QWinApp(); ~QWinA

第三章 窗口部件

1 /* 3-1 myWidget1 */ 2 #include <Qtgui> 3 4 int main (int argc, char* argv[])//为什么是两个参数? 5 { 6 QApplication a(argc,argv); 7 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));//在代码中可以使用中文 8 9 QWidget *widget =new QWidget();//new

《Windows程序设计》读书笔三 窗口与消息

第三章 窗口于消息 前面的例子都使用MessageBox来创建窗口 ,单他所创建的窗口灵活性有限. 3.1 窗口的创建 只要调用CreateWindow函数即可 3.1.1 系统结构概述 一个应用程序窗口可能包含,标题栏,菜单栏,工具栏,滚动条.另外还有一种类型的窗口是对话框,这种窗口可以不带标题栏 还可能包含,按钮,单选按钮,复选框,列表框,滚动条,文本框等.每一个这些对象都被称为 子窗口,或者 控件窗口 当用户改变窗口尺寸时,Windows便向应用程序发送一条携带新窗口尺寸相关的信息,接着应

第三章 消息摘要算法--MD5

注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 3.1.消息摘要算法:防止消息在传递过程中被篡改. 原理:任何消息经过消息摘要算法后,都会产生唯一的散列值(即“数据指纹”)(同一段消息无论经过多少次相同的消息摘要算法加密,结果都相同),所以如果消息在传送过程中被修改,那么算出来的数据指纹也与原本的消息算出来的不同了,如果没有被修改,则数据指纹是相同的. 特点:单向性(即只有加密,没有解密) 3.2.MD5(算法已被破解,应用于安全程度要求

第三章—Windows程序

这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂 本章的名字就叫<Windows程序>而不是<Windows程序设计>所以,我只是讲一些关于Windows程序运作的原理: Windows 为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来.也就是这一个又一个窗口

《增长黑客》阅读内容摘要(前三章)

<增长黑客>阅读内容摘要(前三章) 寒假无聊,偶然间看到<增长黑客>这本名气很大的书,顺便拿来读读.读到后来根本停不下来,这本书真的比电影还精彩.作者提倡的一种新的软件工程,令人叫绝. 以下是这本书前三章的内容摘要: 一.第一章 通常采用的手段包括A/B测试.搜索引擎优化.电子邮件召回.病毒营销等,而页面加载速度.注册转化率.E-mail到达水平.病毒因子这些指标成为他们日常关注的对象. 增长黑客:以数据驱动营销.以市场指导产品,通过技术化手段贯彻增长目标的人. 五个环节:1. 获

C语言探索之旅】 第一部分第四课第三章:变量的世界之显示变量内容

内容简介 1.课程大纲 2.第一部分第四课第三章:变量的世界之显示变量内容 3.第一部分第五课预告:基本运算 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 基本运算 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量