学习Windows SDK编程(Windows 程序设计)

本文详细介绍了Windows程序设计的基础,包括WinMain函数及其参数、MessageBox的使用,以及Windows的消息机制。讲解了WNDCLASS结构、RegisterClass、CreateWindow、WndProc等关键函数,展示了如何处理WM_COMMAND、WM_SIZE等消息。最后,通过一个绘制正弦曲线的示例,解释了窗口过程函数WndProc的工作原理。
摘要由CSDN通过智能技术生成

2012-11-0117:044人阅读评论(0)收藏编辑删除

http://msdn.microsoft.com/en-us/library/ff468919(v=vs.85).aspx Windows 函数查找地址;

一、WinMain函数

(1)

WinMain
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
;

WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数。

程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。

WinMain的第三个参数是用于执行程序的命令列。

WinMain的第四个参数指出程序最初显示的方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中。

MessageBox函数

MessageBox函数用于显示短信息。虽然,MessageBox显示的小窗口不具有什么功能,实际上它被认为是一个对话框。

MessageBox的第一个参数通常是窗口句柄;

第二个参数是在消息框主体中显示的字符串;

第三个参数是出现在消息框标题列上的字符串;

MessageBox的第四个参数可以是在WINUSER.H中定义的一组以前缀MB_开始的常数的组合。

二、Windows的消息机制

什么是消息机制:http://baike.baidu.com/view/2724978.htm

(VC++)请问INT_PTR是什么?:http://blog.csdn.net/xlm289348/article/details/8137538

CALLBACK函数的用法:http://hi.baidu.com/rockcoding/item/7ef4c72f5dee320c73863e2b

WM_COMMAND:http://baike.baidu.com/view/1800767.htm

当用户从菜单选中一个命令项目、当一个控件发送通知消息给去父窗口或者按下一个快捷键将发送WM_COMMAND消息;

WNDCLASS:结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性

http://baike.baidu.com/view/1901950.htm

  wndclass.style =0; // 窗口类型为缺省类型

  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.lpszMenuName=NULL; //窗口无菜单

wndclass.lpszClassName=lpszClassName; //窗口类名为“窗口”

RegisterClass:http://baike.baidu.com/view/1013839.htm

RegisterClass(&wndclass)

CreateWindow:http://baike.baidu.com/view/1001690.htm

ShowWindow:http://baike.baidu.com/view/1013883.htm

UpdateWindow:http://baike.baidu.com/view/1013910.htm

GetMessage:http://baike.baidu.com/view/1013920.htm

函数GetMessage是从调用线程的消息队列里取得一个消息并将其放于指定的结构。

TranslateMessage:http://baike.baidu.com/view/1013950.htm

函数功能:该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessagePeekMessage时被读出。

DispatchMessage:http://baike.baidu.com/view/1013961.htm

函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息

MSG:http://baike.baidu.com/view/868632.htmWindows程序中,消息是由MSG结构体来表示的。

WndProc:http://baike.baidu.com/view/2491884.htm

操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过GetMessage等方法,最终将消息提交到窗口过程WndProc)指向一个应用程序定义的窗口过程的指针

WM_COMMANDhttp://baike.baidu.com/view/1800767.htm当用户从菜单选中一个命令项目、当一个控件发送通知消息给去父窗口或者按下一个快捷键将发送WM_COMMAND 消息。

DialogBox:http://baike.baidu.com/view/1079962.htm

根据对话框模板资源创建一个模态的对话框。DialogBOX函数直到指定的回调函数通过调用EndDialog函数中止模态的对话框才能返回控制。该宏使用DialogBoxParam函数。

DestroyWindow:http://baike.baidu.com/view/1293246.htm

函数功能:销毁指定的窗口。这个函数通过发送WM_DESTROY消息和 WM_NCDESTROY 消息使窗口无效并移除其键盘焦点。这个函数还销毁窗口的菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链。

DefWindowProc:http://baike.baidu.com/view/1080277.htm

函数功能:该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。调用DefWindowProc函数时使用窗口过程接收的相同参数。

WM_SIZE:http://baike.baidu.com/view/2136800.htm

当主窗口的客户区部分大小改变时,我们的应用程序将接收到 WM_SIZE消息。

  参数cx,cy是新窗口客户区的大小!宽度和高度

  注意cxcy最好定义为全局或是静态的,例子如下

  static UINT cx,cy;

  switch (message)

  {

  case WM_SIZE:

  cx=LOWORD(lParam);

  cy=HIWORD(lParam);

break;

WM_PAINT:http://baike.baidu.com/view/1988590.htm

WndProc处理的第二个消息为WM_PAINT。这个消息在Windows程序设计中是很重要的。当窗口显示区域的一部分显示内容或者全部变为“无效”,以致于必须“更新画面”时,将由这个消息通知程序。

当需要绘制一部分应用窗口的时候,这个消息被Windows或者其他应用程序绘制调用。这个消息一般在调用UpdateWindow函数或者当应用程序通过GetMessage函数或者PeekMessage函数来获得一个WM_PAINT消息时候被DispatchMessage函数时候被发送。

WM_PAINT hdc=(HDC)wParam;

BeginPaint:http://baike.baidu.com/view/1014019.htm

BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个

PAINTSTRUCT结构中。

EndPaint:http://baike.baidu.com/view/1877699.htm

EndPaint函数标记指定窗口的绘画过程结束;这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。

MoveToEx:http://baike.baidu.com/view/1882859.htm

LineTo:http://baike.baidu.com/view/2421478.htm

Polyline:http://baike.baidu.com/view/1477217.htm

POINT:http://baike.baidu.com/view/2896490.htm

POINT(点)是一个结构,它定义了一个点的坐标(x,y)

  结构的定义如下:

  typedef struct tagPOINT{

  LONG x;

  LONG y;

  }POINT;

  参数:

  x: 指出一个点的x坐标.

y: 指出一个点的y坐标.

WM_DESTROY:http://baike.baidu.com/view/555468.htm

 

 

 

 

 

 

Windows 程序,窗口绘制正弦曲线

// Cosine.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "Cosine.h"

#include <windows.h> 

#include <math.h> 

#include "stdafx.h"

 

#defineMAX_LOADSTRING 100

#define NUM1000 

#defineTWOPI      (2 * 3.14159) 

 

 

#defineMAX_LOADSTRING 100

 

HINSTANCEhInst;

INT_PTRCALLBACK    About(HWND, UINT, WPARAM,LPARAM);

 

// Message handler for about box.

INT_PTRCALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

    UNREFERENCED_PARAMETER(lParam);

    switch(message)

    {

    caseWM_INITDIALOG:

        return(INT_PTR)TRUE;

 

    caseWM_COMMAND:

        if(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

        {

            EndDialog(hDlg, LOWORD(wParam));

            return(INT_PTR)TRUE;

        }

        break;

    }

    return(INT_PTR)FALSE;

}

 

 

//  FUNCTION: WndProc(HWND, UINT,WPARAM, LPARAM)

//

//  PURPOSE:  Processes messages for the main window.

//

//  WM_COMMAND  - process the application menu

//  WM_PAINT - Paint the main window

//  WM_DESTROY  - post a quit message and return

//

//

LRESULTCALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    int wmId,wmEvent;

    PAINTSTRUCT ps;

    HDC hdc;

    static int  cxClient,cyClient ; 

    int         i ; 

    POINT      apt [NUM] ;

 

    switch(message)

    {

    caseWM_COMMAND:

        wmId   = LOWORD(wParam);

        wmEvent = HIWORD(wParam);

        // Parse themenu selections:

        switch(wmId)

        {

        caseIDM_ABOUT:

            DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

            break;

        caseIDM_EXIT:

            DestroyWindow(hWnd);

            break;

        default:

            returnDefWindowProc(hWnd, message, wParam, lParam);

        }

        break;

    case  WM_SIZE: 

        cxClient= LOWORD (lParam) ; 

        cyClient = HIWORD (lParam) ; 

        return 0; 

    caseWM_PAINT:

        hdc = BeginPaint(hWnd, &ps);

        MoveToEx(hdc, 0,cyClient / 2, NULL); 

        LineTo(hdc, cxClient, cyClient / 2);        

        for (i =0 ; i < NUM ; i++) 

        { 

            apt[i].x = i * cxClient / NUM ; 

            apt[i].y = (int)(cyClient / 2 * (1 - sin (TWOPI * i / NUM))) ; 

        } 

 

        Polyline (hdc, apt, NUM) ; 

        return 0; 

        // TODO: Addany drawing code here...

        EndPaint(hWnd, &ps);

        break;

    caseWM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        returnDefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

 

 

int WINAPIWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, intiCmdShow) 

    static TCHARszAppName[] = TEXT ("SineWave"); 

    HWND         hwnd ; 

    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.lpszMenuName  = NULL ; 

    wndclass.lpszClassName = szAppName ; 

 

    if(!RegisterClass (&wndclass))

    { 

        MessageBox (  NULL, TEXT ("Programrequires Windows NT!"), 

            szAppName, MB_ICONERROR) ; 

        return 0; 

    } 

 

    hwnd = CreateWindow ( szAppName, TEXT ("Sine Wave Using Polyline"), 

        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) ; 

    } 

    returnmsg.wParam ; 

}

 

主要是两个函数:WinMain和WndProc,

实现过程:

一、WinMain函数中:

(1) 首先初始化WNDCLASS 结构,wndclass.lpfnWndProc= WndProc ; 其中包括对窗口处理函数的初始化;

(2) 然后注册RegisterClass初始化的结构;

(3) 注册成功后创建窗口,wndclass.lpszClassName=lpszClassName; 窗口类名,注册的窗口类名和CreateWindow创建窗口时的窗口类名相同,

(4) ShowWindow显示窗口;

(5) UpdateWindow更新窗口;

(6) 循环获取消息:GetMessage

TranslateMessage:该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessagePeekMessage时被读出。

DispatchMessage:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息

二、WndProc

操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过GetMessage等方法,最终将消息提交到窗口过程WndProc)指向一个应用程序定义的窗口过程的指针

根据获得的不同消息,执行响应函数;如case WM_PAINT执行相应的绘制功能;如果没有要执行的,则执行DefWindowProc函数功能:该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。调用DefWindowProc函数时使用窗口过程接收的相同参数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值