`
runfeel
  • 浏览: 913571 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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 ;

POINTapt [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");

HWNDhwnd ;

MSGmsg ;

WNDCLASSwndclass ;

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函数时使用窗口过程接收的相同参数。

分享到:
评论
1 楼 lshhjxlj 2014-02-25  
介绍的很详细,感谢楼主辛勤劳动!

相关推荐

    windowsSDK程序设计

    《Windows SDK程序设计》是一个经典的教程,主要针对想要学习Windows程序设计的初学者。Windows SDK(Software Development Kit)是微软提供的开发工具集,包含了编写Windows应用程序所需的头文件、库文件、文档以及...

    Windows SDK编程资料

    本压缩包中的“Windows SDK编程资料”是一份专为入门至中等水平的开发者设计的学习资源,旨在帮助他们深入理解和掌握Windows平台上的软件开发。 在Windows SDK中,最重要的组成部分之一是头文件(.h),它们包含了...

    Windows 程序设计 (SDK)

    Windows程序设计,通常涉及到使用Windows SDK(Software Development Kit),它是一组工具、库和文档,帮助开发者构建原生Windows应用程序。SDK提供了与Windows操作系统交互所需的API(Application Programming ...

    windowsSDK编程mp3播放器

    在Windows SDK编程中,开发一个MP3播放器是一项涉及多媒体处理、用户界面设计以及系统调用的复杂任务。Windows SDK(Software Development Kit)是微软提供的一个工具集,它包含了开发Windows应用程序所需的各种...

    windows SDK编程

    Windows SDK(Software Development Kit)是微软为开发者提供的一套用于创建Windows平台应用程序的工具集,它包含了...《Windows程序开发》这本书是这个领域的经典之作,可以帮助开发者更深入地理解和运用Windows SDK。

    C语言windows程序设计SDK中文版

    通过学习《C语言Windows程序设计SDK中文版》,开发者不仅能掌握Windows环境下的C语言编程技巧,还能深入理解操作系统的工作原理,为更高级的系统级编程打下坚实基础。无论是初学者还是有经验的开发者,都能从中...

    windows程序设计教程

    在学习Windows程序设计时,你将深入理解以下关键概念: 1. **进程与线程**:了解进程作为资源分配的基本单位,线程作为执行的基本单位,以及如何在多线程环境中同步和通信。 2. **消息队列与消息循环**:Windows...

    Windows-SDK-8.1_C++包

    Windows SDK(Software Development Kit)8.1是微软为开发者提供的一套全面的工具集,用于构建、调试和部署针对Windows 8.1及其以上版本的应用程序。它包含了丰富的编程接口、头文件、库以及文档,特别是对C++开发的...

    用C++封装SDK编程,学习作品

    标题中的“用C++封装SDK编程,学习作品”意味着这个项目是关于使用C++语言来包装SDK(Software Development Kit)的实践过程,旨在提升开发者的技术能力和理解。SDK通常包含库、API接口、工具和其他资源,方便开发...

    WinSDK编程

    1. Charles Petzold的《Programming Windows》,中文版为《Windows程序设计》。这本书是Windows编程的经典之作,详细介绍了Windows API和Win32编程。 2. 刘振安的《Windows编程》,虽然出版较早,但对于初学者来说,...

    windows sdk api写的ide

    这种IDE专为Windows操作系统设计,主要用于C++编程语言,允许开发者创建、编辑、编译和调试Windows应用程序。下面将详细讨论Windows SDK、API以及如何使用它们来构建IDE。 Windows SDK(Software Development Kit)...

    VC windows SDK 时钟界面屏幕保护程序

    本项目是一个使用VC++与Windows SDK结合,设计并实现的一个时钟屏幕保护程序,对于初学者来说,这是一个极好的实践案例,可以深入了解Windows API和屏幕保护程序的开发。 首先,我们来理解一下Windows SDK。它包含...

    WinSDK编程(续)_windows消息机制

    在Windows SDK编程中,消息机制是Windows应用程序设计的核心部分,它允许程序响应各种用户交互和其他系统事件。本文将深入探讨Windows消息机制的概念、工作原理以及如何在实际编程中使用。 一、Windows消息机制概述...

    Windows SDK编程之简单对话框.docx

    在Windows SDK编程中,创建一个简单的对话框是一个基础但重要的步骤,这通常涉及到Windows应用程序的用户界面设计。本文档将引导你通过使用Visual C++ 6.0来实现这一过程。 首先,启动Visual C++ 6.0,然后创建一个...

    WinSDK编程.chm(中文版)

    WinSDK编程.chm,找了很久才找到的,希望大家多多珍惜!很不错的哦~~

    windows sdk 7.1 例子

    这个SDK包含了各种组件、库、文档和示例代码,帮助开发者理解和利用Windows API,实现高效且稳定的程序设计。 标题中的"windows sdk 7.1 例子"意味着这个压缩包提供了SDK的示例代码,这对于初学者或经验丰富的...

    windows sdk 窗体图标的更改

    在Windows SDK中,窗体图标(Form Icon)的更改是一个常见的任务,...总之,更改Windows SDK应用程序的窗体图标是一个涉及到资源管理、编程和UI设计的过程。理解这些知识点对于开发高效且美观的Windows应用至关重要。

    windows_sdk编程系列文章02_----_简单窗口程序

    在Windows SDK编程中,创建一个简单的窗口程序涉及一系列步骤,这些步骤构成了Windows应用程序的基本框架。以下是对这些步骤的详细解释: 1. **得到应用程序句柄**:句柄是Windows操作系统中标识对象(如窗口)的...

    《吃豆人》纯WindowsSDK程序

    《吃豆人》纯Windows SDK程序是一款基于Windows操作系统开发的游戏,专为初学者设计,用于教授Windows编程技术。...通过分析和研究这个程序,可以深入了解Windows SDK编程的细节,以及如何在实际应用中实施复杂的算法。

    Windows程序设计-王艳萍

    学习Windows SDK编程,你需要理解窗口过程、消息循环、线程管理、内存分配、文件操作等基本概念。此外,书中可能还会介绍GDI(Graphics Device Interface)用于图形绘制,以及Winsock用于网络通信的相关接口。 MFC...

Global site tag (gtag.js) - Google Analytics