《Windows程式设计》笔记1

第一部分 the Basics
第一章 开始
第二章 Unicode简介

        Unicode扩展自ASCII字元集。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。

第三章 视图和讯息

3.1 总体结构
进行Windows程式设计,实际上是在进行一种物件导向的程式设计(OOP),那些视窗以及「子视窗」或「控制项视窗」或「子视窗控制项」作为物件,使用者会在萤幕上看到这些视窗,并通过键盘和滑鼠直接与它们进行交互操作。视窗以「讯息」的形式接收视窗的输入,视窗也用讯息与其他视窗通讯。例如,当使用者改变视窗的大小时,Window给程式发送一个讯息指出新视窗的大小。然後程式就可以调整视窗中的内容,以回应大小的变化。所谓「Windows给程式发送讯息」,是指Windows呼叫程式中的一个函式,该函式的参数描述了这个特定讯息。这种位於Windows程式中的函式称为「视窗讯息处理程式」。这种方式是作业系统呼叫程式,而这正是Windows物件导向架构的基础。程式建立的每一个视窗都有相关的视窗讯息处理程式。Windows通过呼叫视窗讯息处理程式来给视窗发送讯息。视窗讯息处理程式根据此讯息进行处理,然後将控制传回给Windows。更确切地说,视窗通常是在「视窗类别」的基础上建立的。视窗类别标识了处理视窗讯息的视窗讯息处理程式。使用视窗类别使多个视窗能够属於同一个视窗类别,并使用同一个视窗讯息处理程式。
Windows程式开始执行後,Windows为该程式建立一个「讯息伫列」。这个讯息伫列用来存放该程式可能建立的各种不同视窗的讯息。程式中有一小段程式码,叫做「讯息回圈」,用来从伫列中取出讯息,并且将它们发送给相应的视窗讯息处理程式。有些讯息直接发送给视窗讯息处理程式,不用放入讯息伫列中。

3.2 HELLOWIN程式
建立一个视窗首先需要注册一个视窗类别,那需要一个视窗讯息处理程式来处理视窗讯息。

下面程序至少调用了18个Windows函数

 程式3-1  HELLOWIN
HELLOWIN.C
/*------------------------------------------------------------------------
           HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
                      (c) Charles Petzold, 1998
 -----------------------------------------------------------------------*/

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//视窗讯息处理函数

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT ("HelloWin") ;
        HWND        hwnd ;
        MSG         msg ;
        WNDCLASS    wndclass ;

        wndclass.style           = CS_HREDRAW | CS_VREDRAW ;  //视窗类别样式
        wndclass.lpfnWndProc     = WndProc ;  //将这个视窗类别的视窗讯息处理程式设定为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.lpszMenuNam     = NULL ; //菜单
        wndclass.lpszClassName   = szAppName ;    //类别名称

        if (!RegisterClass (&wndclass))   //为程式视窗注册视窗类别
     {
                MessageBox (        NULL, TEXT ("This program requires Windows NT!"),
                                          szAppName, MB_ICONERROR) ;                  //显示讯息方块
                return 0 ;
     }
        hwnd = CreateWindow( szAppName,        // window class name                 根据视窗类别建立一个视窗
                             TEXT ("The Hello Program"),        // window caption
                             WS_OVERLAPPEDWINDOW,        // window style
                             CW_USEDEFAULT,        // initial x position
                             CW_USEDEFAULT,        // initial y position
                             CW_USEDEFAULT,        // initial x size
                             CW_USEDEFAULT,        // initial y size
                             NULL,                 // parent window handle
                             NULL,                 // window menu handle
                             hInstance,            // program instance handle
                             NULL) ;               // creation parameters
    
        ShowWindow (hwnd, iCmdShow) ;       //在萤幕上显示视窗,iCmdShow确定最初如何在萤幕上显示视窗
        UpdateWindow (hwnd) ;               //指示视窗自我更新
     /*呼叫UpdateWindow之後,视窗就出现在视讯显示器上。程式现在必须准备读入使用者用键盘和滑鼠输入的资料。Windows为当前执行的每个Windows程式维护一个「讯息伫列」。在发生输入事件之後,Windows将事件转换为一个「讯息」并将讯息放入程式的讯息伫列中。*/
     //程式通过执行一块称之为「讯息回圈」的程式码从讯息伫列中取出讯息
        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://当Windows在WinMain中处理CreateWindow函式时,WndProc接收这个讯息。
        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://这一个讯息指示,Windows正在根据使用者的指示关闭视窗。
                PostQuitMessage (0) ;    //在讯息伫列中插入一个「退出程式」讯息
                return 0 ;
     }
   return DefWindowProc (hwnd, message, wParam, lParam) ;    //执行内定的讯息处理
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值