|
|
windows编程通用的Win32类型和常见的结构
2 \8 k% V4 O- A# E* p4 [作者:雷神 6月20日 10:00
' l6 F4 _' w$ F% l( s: l' A CALLBACK 在应用程序的回调例程中取代FAR PASCAL$ `$ }: l3 A! _( Z9 E4 L7 B1 Z
HANDLE 一个32位的无符号整数,用作句柄
/ M; w. E1 M7 H* `; T5 vHDC 设备描述句柄
- t; V& `% V( u) C% w& MHWND 一个32位的无符号整数用作窗口句柄2 m5 `& H# P* M$ D: O2 s" L5 e
LONG 一个32位的带符号整数
- V1 u: j" Q" d$ H2 M# \/ k, iLPARAM 用于声明lParam的类型5 l. J% ~6 k& P# A+ y" ?
LPCSTR 与LPSTR类似,但用于只读字符串指针
" `/ S3 s; T0 @5 P- dLPSTR 一个32位的指针
3 M$ `9 E/ D. F7 x& h( iLPVIOD 一个普通指针类型等价于(viod *) V. ^0 N, ]& j* j8 t! E5 L
LRESULT 子窗口过程的返回值, K+ e+ Q, Q$ A" P; ]8 n- l
NULL 一个整型的0值,常常用于激活函数的缺省动作和参数
6 F3 Q1 b5 \& V( k2 ^7 ~% ]UINT 一种无符号的整数类型,其大小取决于主机环境;在NT下是32位% V+ _" Y) V9 c" X. ?) n9 l
WCHAR 一种16位的UNICODE字符,用于表示世界上所有语言的符号。
% P( ?( L# l3 y7 c. @/ N( qWINAPI 在API的定义中取代FAR PASCAL, {7 s+ F- R/ y5 G {4 n
WPARAM 关于wParam的声明6 ]9 h* ?0 R+ ?7 B4 H
Win32应用程序中常见的结构
( W. W+ [" a; n结构 描述% N2 |) n8 t) R( U' \) P( S5 i
------------------------------------------------ I# x* @6 ?: }% Q( j9 h
MSG 定义了输入消息域
8 G q! L i! j. u* f, v9 WPAINTSTRUCT 定义了在窗口内绘图时使用的绘图结构' L3 @6 n& u' k9 ]: u( u) d
RECT 定义一个矩形, ^1 ]0 x# M2 o# O. v
WNDCLASS 定义一个窗口类" C7 o* Z" [: d
一个例子:
$ R) Q0 R) C- W9 _#include
* t7 @$ H: d% g7 `6 }1 M; sLRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
& R: _- W" Y$ }( R- j0 ]char szProgName[]=" rogName";# ?. D7 G8 `& \# s! i1 \1 W
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdline,int nCmdShow)4 H0 P4 \' V/ J1 u# v& d; P, \
//Winmain()是应用程序开始和结束的地方。主要负责注册应用程序的窗口类型;执行必须的初始化过程;创建并初始化应用程序的消息循环(用以接收程序的消息队列);结束程序,通常是在接受了WM_QUIT消息时。
* U" ?$ { V3 G# \//从WINDOWS向WINMAIN()传递四个参数:
4 N( j) d! y8 x9 }//参数1hInst:是实例句柄,当应用程序在WINDOWS下运行时,这个数字标识了应用程序。( c( j: U9 ^ B( O8 ^
//参数2hPrevInst:将始终是一个NULL值,表示没有这个应用程序的其他实例在运行。
8 s- m2 ?8 l1 h0 B( h6 b8 w3 [9 N//参数3lpCmdline:3 x) `! N3 b; a6 [
//参数4nCmdShow:8 ]5 I g* x: v) O& |
{, x# [1 b5 I9 Y- R
HWND hWnd;
! s6 s, T* Z( Q% }# h) f7 nMSG lpMsg;
7 x4 T3 P0 H& U8 I/ W( S% GWNDCLASS wcApp;
3 D( m5 E, |( f: XwcApp.lpszClassName =szProgName;
, p$ O: L8 b4 U6 t( f- owcApp.hInstance =hInst;3 C; Q* Z, h% b# a
wcApp.lpfnWndProc =WndProc;
' @1 B* B! J$ v8 Q4 a `5 nwcApp.hCursor =LoadCursor(NULL,IDC_ARROW);
/ D/ [. ]. P& z- x# K& BwcApp.hIcon =0;1 a7 S- t2 ]# H$ e2 D& v
wcApp.lpszMenuName =0;' b! p( F0 ]6 a: l- v+ M1 ?# Q$ ~
wcApp.hbrBackground =GetStockObject(WHITE_BRUSH);9 r& A$ P4 Q4 r* y6 h
wcApp.style =CS_HREDRAW|CS_VREDRAW;- z( O* l/ t( S' ^
wcApp.cbClsExtra =0;
; v! W$ X2 R+ o% J8 ]# }: iwcApp.cbWndExtra =0;
. @5 E* p) Q+ jif (!RegisterClass(&wcApp))+ i6 _8 o! x/ p5 G0 M' f# @4 \
return 0;
9 c8 I- J* J6 Y: m9 \hWnd=CreateWindow(szProgName,"这是一个例子",
& T# t0 k& u8 z* p$ AWS_OVERLAPPEDWINDOW,/ Q7 T* p8 K6 [
CW_USEDEFAULT,6 E, r) K9 ~( ^2 D; K" g* @
CW_USEDEFAULT,
0 {3 ^, S3 e" ICW_USEDEFAULT,# _6 V) H+ a" I
CW_USEDEFAULT," W% i5 r. V6 J& _, x' e
(HWND)NULL,
5 b% E2 E/ ^% h$ Z! F(HMENU)NULL,
: @$ @# J! L: B5 J$ N( P8 P(HANDLE)hInst,- U$ g# V9 Z. f5 g- _
(LPSTR)NULL);% D, u- J! E6 Q- R
ShowWindow(hWnd,nCmdShow);5 B/ i" v! y* u1 A" d
UpdateWindow(hWnd);
, m2 D2 P* S ~, o" e" Kwhile (GetMessage(&lpMsg,0,0,0)){
8 R* s I+ i6 i6 I$ ]; t& i% d7 d$ ZTranslateMessage(&lpMsg);6 `- W0 m+ X4 `1 V
DispatchMessage(&lpMsg);
6 H# a- J3 K: e}
+ ^! q( f% z) }6 }. k* yreturn (lpMsg.wParam );2 x/ }4 R4 l3 z' U$ G, [
}
8 V2 c' D, n) q2 pLRESULT CALLBACK WndProc(HWND hWnd,UINT messg,WPARAM wParam,LPARAM lParam)
. J, F; t% b( x$ l{
, j' K+ ^1 l- U* GHDC hdc;
8 p4 O: L/ @1 H: C/ B( ]2 }PAINTSTRUCT ps;! D* u: U U& [! X8 t$ \ D @3 r
switch (messg); [8 U' T) H: H6 c0 I8 J+ p
{
' I' b4 A2 {/ Xcase WM_PAINT:
6 W6 c# i! \6 t) @8 t( u8 V khdc=BeginPaint(hWnd,&ps);' |: l' G0 a8 H
MoveToEx(hdc,0,0,NULL);! \- P9 X* G- R, z) p8 X# l
LineTo(hdc,639,429);# g( I4 C6 P3 E2 R
MoveToEx(hdc,639,0,NULL);6 n: ?$ q F: e }
LineTo(hdc,0,429);
4 j3 n E H$ ?9 ?3 Y7 CTextOut(hdc,120,30,"一些线",6);
; ^* g6 K# b% m+ L" M; j1 @Chord(hdc,450,20,430,80,455,25,425,70);
2 E' b0 C6 G3 s* G# Y# j* ETextOut(hdc,470,30,"弧线",4);
6 T) B" g8 K8 Q0 {& bPie(hdc,350,50,400,150,300,50,300,100);7 k$ ?: `- M% \1 V* \
TextOut(hdc,350,50,"饼图",4);
+ L' ?) d" M3 W4 XEllipse(hdc,100,100,400,400);
' P( [! W# Q* p' p# e% |: t3 BEllipse(hdc,249,249,251,251);5 B- {, c% N9 l! l
TextOut(hdc,250,250,"圆心",4);* L: L6 n% [: r% Q3 a
Rectangle(hdc,50,300,150,400);
* P9 {1 A% |) UValidateRect(hWnd,NULL);& e3 e: |2 C( ~8 C% E
EndPaint(hWnd,&ps);0 |7 e: \* a. @3 @: x5 X8 ^
break;
! F) o3 r" j& P' S, T: [case WM_DESTROY:
& }) m/ `+ k, g. h2 P6 GPostQuitMessage(0);0 ` E7 V' g. j! [
break;8 x) Z- N. T0 F! s+ x% o7 U4 K
default:
$ p& c$ t/ r6 `return(DefWindowProc(hWnd,messg,wParam,lParam));( K, w" ?& F C( b- g; \" s
break;
2 \5 c% B; y; d4 m- Y, U}6 f* N; D9 f6 i( t7 _' o: o* m
return 0;. ~0 |$ v# @# Q
}
/ E7 K% F7 ?5 @
4 k; [& m4 ]$ S1 ?6 e+ h |
|