??xml version="1.0" encoding="utf-8" standalone="yes"?> 二?/////////////创徏插入W?br />主要有五个插入符号函式: 使用插入W号的主要规则很单: 三、捕获鼠标:是鼠标移出客户区时依焉要鼠标鼠标的位置。这是捕?br />SetCapture (hwnd) ;Windows 所有滑鼠讯息发l视H代号ؓhwnd 的视H讯息处理程式?br />ReleaseCapture () ;释放 WPARAM的参?nbsp; VK_LWIN 5B Left Windows ?(Microsoft自然键盘)
Backspace 0x08 Ctrl-H \b
Tab 0x09 Ctrl-I \t
Ctrl-Enter 0x0A Ctrl-J \n
Enter 0x0D Ctrl-M \r
Esc 0x1B Ctrl-[
现在一般处理字W消息?/p>
CreateCaret 建立与视H有关的插入W号
SetCaretPos 在视H中讑֮插入W号的位|?br />ShowCaret 昄插入W号
HideCaret 隐藏插入W号
DestroyCaret 撤消插入W号
另外Q?br />GetCaretPos 取得插入W号目前位置
GetCaretBlinkTime 取得插入W号闪烁旉
SetCaretBlinkTime 讑֮插入W号闪烁旉
1、视H讯息处理程式在WM_SETFOCUS 讯息理期间呼叫CreateCaretQ在WM_KILLFOCUS讯息处理期间呼叫DestroyCaret?br />2、插入符号刚建立时是隐蔽的。想使插入符号可见,CreateCaret QShowCaret
3、当视窗讯息处理E式处理一条非WM_PAINT 讯息而且希望在视H内l制某些东西Ӟ它必d叫HideCaret 隐藏插入W号。在l制完毕後,再呼叫ShowCaret昄插入W号。HideCaret 的媄响具有篏U效果,相同ơ数Ӟ才能看到插入W号?/p>
W号帔R 十六q制? 指定的鼠标或键盘按键
VK_LBUTTON 01 鼠标左键Q一般不用)
VK_RBUTTON 02 鼠标右键Q一般不用)
VK_CANCEL 03 Control-break q程
VK_MBUTTON 04 鼠标中键Q一般不用)
VK_BACK 08 BACKSPACE ?br /> VK_TAB 09 TAB ?
VK_CLEAR 0C CLEAR 键(Num Lock关闭时的数字键盘5Q?br /> VK_RETURN 0D ENTER 键(回R键)
VK_SHIFT 10 SHIFT ?br /> VK_CONTROL 11 CTRL ?br /> VK_MENU 12 ALT ?br /> VK_PAUSE 13 PAUSE ?nbsp; //Q?Q?br /> VK_CAPITAL 14 CAPS LOCK 键(大写锁定键)
VK_ESCAPE 1B ESC ?br /> VK_SPACE 20 SPACEBARQ空格键Q?br /> VK_PRIOR 21 PAGE UP 键(上页Q?br /> VK_NEXT 22 PAGE DOWN 键(下页Q?br /> VK_END 23 END ?br /> VK_HOME 24 HOME 键(一般用来做开始)
VK_LEFT 25 LEFT ARROW ?br /> VK_UP 26 UP ARROW ?br /> VK_RIGHT 27 RIGHT ARROW ?br /> VK_DOWN 28 DOWN ARROW ?br /> VK_SELECT 29 SELECT ?nbsp; //Q?Q?
VK_EXECUTE 2B EXECUTE ?nbsp; //Q?Q?
VK_SNAPSHOT 2C PRINT SCREEN键(用于Windows 3.0及以后版本)
VK_INSERT 2D INS 键(Insert键)
VK_DELETE 2E DEL 键(Delete键)
VK_HELP 2F HELP ?nbsp; //Q?Q找不到
///////////////////////////////////////////////////
对于字母键和非小键盘上的数字?直接在单引号中加入该键就?
比如:a?'A'
1?'1'
//////////////////////////////////////////////
VK_RWIN 5C Right Windows ?(Microsoft自然键盘)
VK_APPS 5D Applications ?(Microsoft自然键盘)
VK_NUMPAD0 60 数字键盘上?0 ?br /> VK_NUMPAD1 61 数字键盘上?1 ?br /> VK_NUMPAD2 62 数字键盘上?2 ?br /> VK_NUMPAD3 63 数字键盘上?3 ?br /> VK_NUMPAD4 64 数字键盘上?4 ?br /> VK_NUMPAD5 65 数字键盘上?5 ?br /> VK_NUMPAD6 66 数字键盘上?6 ?br /> VK_NUMPAD7 67 数字键盘上?7 ?br /> VK_NUMPAD8 68 数字键盘上?8 ?br /> VK_NUMPAD9 69 数字键盘上?9 ?br /> VK_MULTIPLY 6A Multiply ?Q?键)
VK_ADD 6B Add 键(+Q?br /> VK_SEPARATOR 6C Separator ?br /> VK_SUBTRACT 6D Subtract ?Q?#8212;Q?br /> VK_DECIMAL 6E Decimal 键(.Q?br /> VK_DIVIDE 6F Divide ?/)
VK_F1 70 F1 ?br /> VK_F2 71 F2 ?br /> VK_F3 72 F3 ?br /> VK_F4 73 F4 ?br /> VK_F5 74 F5 ?br /> VK_F6 75 F6 ?br /> VK_F7 76 F7 ?br /> VK_F8 77 F8 ?br /> VK_F9 78 F9 ?br /> VK_F10 79 F10 ?br /> VK_F11 7A F11 ?br /> VK_F12 7B F12 ?br /> VK_F13 7C F13 ?br /> VK_F14 7D F14 ?br /> VK_F15 7E F15 ?br /> VK_F16 7F F16 ?br /> VK_F17 80H F17 ?br /> VK_F18 81H F18 ?br /> VK_F19 82H F19 ?br /> VK_F20 83H F20 ?br /> VK_F21 84H F21 ?br /> VK_F22 85H F22 ?br /> VK_F23 86H F23 ?br /> VK_F24 87H F24 ?br /> VK_NUMLOCK 90 NUM LOCK ?br /> VK_SCROLL 91 SCROLL LOCK ?br />/////下面的键盘找不到
VK_ATTN F6 Attn ?br /> VK_CRSEL F7 CrSel ?br /> VK_EXSEL F8 ExSel ?br /> VK_EREOF F9 Erase EOF ?br /> VK_PLAY FA Play ?br /> VK_ZOOM FB Zoom ?br /> VK_OEM_CLEAR FE Clear ?br />
]]>
1、分配内存:
GLOBALHANDLE hGlobal = GlobalReAlloc (hGlobal, dwSize, uiFlags) ;
uiFlagsQ?br />GMEM_FIXED //初始化每一位ؓ0
#define GPTR (GMEM_FIXED | GMEM_ZEROINIT) //
#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT) //q回一个虚拟地址
2、访问内存块Q?br /> int *p = (int *) GlobalLock (hGlobal) ;
解锁内存块:GlobalUnlock (hGlobal) ;
释放内存;hGlobal = GlobalHandle (p) ;
3、把文本送到剪脓?br />Q?Q、分配内存,后面是以NULLl尾的,故要加一
hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ;
Q?Q、锁定ƈ获得指针Q?br />pGlobal = GlobalLock (hGlobal) ;
Q?Q、复Ӟ
for (i = 0 ; i < wLength ; i++)
*pGlobal++ = *pString++ ;
Q?Q、由于不用hGlobal 了,可以解锁Q?br />GlobalUnlock (hGlobal); //可以防止泄漏
Q?Q、打开剪脓板ƈ清空
OpenClipboard (hwnd) ;
EmptyClipboard () ;
Q?Q、设|剪贴板数据Qƈ关闭剪脓板:
SetClipboardData (CF_TEXT, hGlobal) ;
CloseClipboard () ;
//注意Q不要将锁定的句柄送给剪脓ѝ?br />//当从E序d数据旉要锁定hGlobal 句柄以访问内?/p>
4、从剪脓板获取文本:
Q?Q确定剪贴板是否含有数据QbAvailable = IsClipboardFormatAvailable (CF_TEXT) ;
Q?Q、先打开剪脓板:OpenClipboard (hwnd) ;
Q?Q获得句柄:hGlobal = GetClipboardData (CF_TEXT) ;
Q?Q把数据复制到程序前先分配内存:pText = (char *) malloc (GlobalSize (hGlobal)) ;
获得数据大小GlobalSize (hGlobal)
Q?Q、锁定句柄获取指向剪贴板的指针:pGlobal = GlobalLock (hGlobal) ;
Q?Q、复制数据:strcpy (pText, pGlobal) ;或者while (*pText++ = *pGlobal++) ;
Q?Q、解锁后关闭剪脓?br />GlobalUnlock (hGlobal) ;
CloseClipboard ();
(5)、逐次获得数据iFormatQ?br />iFormat = 0 ;
OpenClipboard (hwnd) ;
while (iFormat = EnumClipboardFormats (iFormat))
?br /> //
?br />CloseClipboard () ;
您剪贴板不同格式的个敎ͼ //iCount = CountClipboardFormats () ;
//q程
一、写入数据到剪脓?br />1、打开
BOOL OpenClipboard( __in HWND hWndNewOwner ); 如果函数执行成功,q回非零? 如果函数执行p|,q回?Z获得更多的错误信息,调用GetLastError.
2、清I?br /> BOOL EmptyClipboard( VOID );该函数清I剪切板q攑։切板内数据的句柄。函数在之后会将剪切板的所有权指派l当前打开剪切板的H口?
3、设|数?br />HANDLE SetClipboardData(
UINT uFormat, //数据的格?br /> HANDLE hMem //数据指定的内存Ş?br />);
①、?
HGLOBAL GlobalAlloc 分配内存
( UINT uFlags, // 分配属?方式)
DWORD dwBytes // 分配的字节数
);
//注意要用GMEM_MOVEABLE 标志
②、锁?nbsp; 锁定内存中指定的内存块,q返回一个地址|令其指向内存块的起始?br />LPVOID GlobalLock( HGLOBAL hMem // handle to global memory object );
③解锁
GlobalUnlock函数解除锁定的内存块Q指向该内存块的指针无效,GlobalLock锁定的内存,一定要用GlobalUnlock解锁?/p>
4、关?br /> BOOL CloseClipboard(VOID); //关闭剪脓?q其他H口能访问剪贴板?/p>
二、读?br />1、打开 q检查IsClipboardFormatAvailable_
2、获?nbsp; GetClipboardData
注意使用
用GlobalLock锁定剪脓杉K内存?
GlobalSize可以用来获取该内存块的大?
使用GlobalUnlock解除锁定
3、关?/p>
1、三大函?br />从源写到目标
BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop)Q?/p>
从源写到目标 Q可以拉?br />BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeighDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)Q?/p>
选定刷子?br />函数原型QBOOL PatBlt(HDC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, DWORD dwRop)Q?/p>
2、加载位图资源:
Q?Q、加?nbsp; hBitmap=LoadBitmap(hinst,MAKEINTRESOURCE(IDB_BITMAP2));
Q?Q、得到对?nbsp; GetObject(hBitmap,sizeof(BITMAP),&bitmap);
Q?Q创建内存DC hdcMem=CreateCompatibleDC(hdc); //创徏内存dc
(4)把位囑֯象选中到内存dc?nbsp; SelectObject(hdcMem,hBitmap);
(5)?BitBlt、StretchBlt、PatBltdQ?br />注意要删除DC,和对?br />DeleteDC(hdcMem);
DeleteObject(hBitmap);
3、填充bitmap创徏单色位图?br />先用数据填充bitmap。然后调用CreateBitmap(&bitmap);
4、用位图做画?nbsp; HBRUSH CreatePatternBrush(HBITMAP hbmp)Q
该函数可以创建具有指定位图模式的逻辑刷子Q该位图不能是DIBcd的位图,DIB位图是由CreateDIBSection函数创徏的?br />
二、透明位图/透明H口
//改变扩展风格
DWORD dwStyle=GetWindowLong(hwnd,GWL_EXSTYLE);
SetWindowLong(hwnd,GWL_EXSTYLE,dwStyle^0x80000);
//动态链接库
hinst=LoadLibrary("User32.DLL");
if(hinst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND ,COLORREF,BYTE,DWORD);
MYFUNC fun=NULL;
//获得指针
fun=(MYFUNC)GetProcAddress(hinst,"SetLayeredWindowAttributes");
if (fun)
{
fun(hwnd,0,180,2); //讄
}
}
//扩展风格WS_EX_LAYERED
一、创建:
CreateMetaFileQ)Q?NULL表示存储在内存中
CloseMetaFile //q回元文件句?br />PlayMetaFile //在指定的讑֤场景中回放一个图元文件。与原元文g的坐标有养I故要定义原点在哪里。。?br />DeleteMetaFile //删除
hmf=GetMetaFileQszFileNameQ; //获得句柄
CopyMetaFile //为元文g制定一个副?br />EnumMetaFile //Z个标准的windows囑օ文g枚D单独的图元文件记?br />PlayMetaFileRecord //回放来自囑օ文g的单条记录(每条记录都包含了单个GDIl图命oQ?br />//EnumMetaFileProc
int CALLBACK EnumMetaFileProc(
HDC hDC, // handle to device context
HANDLETABLE FAR *lpHTable, // pointer to metafile handle table
METARECORD FAR *lpMFR, // pointer to metafile record
int nObj, // count of objects
LPARAM lpClientData // pointer to optional data
);
GetMetaFileBitsEx
SetMetaFileBitsEx
//增强型元文g
CreateEnhMetaFile //创徏增强型元文g
CloseEnhMetaFile //q回元文件句柄?br />PlayEnhMetaFile //昄元文?br />GetEnhMetaFileHeader(hemf,cbsize,&emh); //获得ENHMETAHEADER信息?br />GetEnhMetaFile //取得盘文g中包含的一个增强型囑օ文g的图元文件句?br />EnumEnhMetaFile
PlayEnhMetaFileRecord // 回放单独一条增强型囑օ文g记录
//
CopyEnhMetaFile
DeleteEnhMetaFile
EnhMetaFileProc
GdiComment
GetEnhMetaFileBits
GetEnhMetaFileDescription
GetEnhMetaFilePaletteEntries
GetWinMetaFileBits
SetEnhMetaFileBits
SetWinMetaFileBits
记录数据的元文gQ?br />ENHMETAHEADER
typedef struct tagENHMETAHEADER { // enmh
DWORD iType; //cd
DWORD nSize; //大小
RECTL rclBounds; //指出囑փ大小
RECTL rclFrame; //
DWORD dSignature; //字符?#8220;EMF”
DWORD nVersion; //0X00010000
DWORD nBytes; //d节数
DWORD nRecords; //指出记录数。(头记录,GDI函数调用{记录)
WORD nHandles; //指出元文件用图形对象的非默认句柄数量?br /> WORD sReserved;
DWORD nDescription; //描述串的大小
DWORD offDescription; //描述串在文g中的偏移?br /> DWORD nPalEntries; //调试板中条目的个?br /> SIZEL szlDevice; //指出以像素ؓ单位的输备大?br /> SIZEL szlMillimeters; //以mm为单位输出的讑֤大小
DWORD cbPixelFormat; //描述?br /> DWORD offPixelFormat;
DWORD bOpenGL;
} ENHMETAHEADER;
一、用于文本输出的函数Q?br />1、TextOut (hdc, xStart, yStart, pString, iCount) ;
2、TabbedTextOut ( hdc, xStart, yStart, pString, iCount,iNumTabs, piTabStops, xTabOrigin) ;iNumTabs制表位数QpiTabStops以像素ؓ单位的制表位数。xTabOriginq_字符宽度讄?br />3、BOOL ExtTextOut(HDC hdc, int X, int Y, UINT fuOptions, CONST RECT *lprc, LPCTSTR lpString, UINT cbCount, CONST INT *lpDx)QlpDx指定字符串中q箋字符的间隔、NULL为默认?br />4、int DrawText(HDC hDC, LPCTSTR lpString,int nCount, LPRECT lpRect, UINT uFormat )Q?br />5、int DrawTextEx(HDC, hdc, LPTSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams)Q?/p>
二、逻辑字体
1、CreateFont 或CreateFontIndirect建立逻辑字体
2、GetTextFace (hdc, sizeof (szFaceName) / sizeof (TCHAR), szFaceName) ;获得字体?br />3、GetTextMetrics (hdc, &textmetric) ;获得字体信息
三?br />该函Cؓ指定的设备环境设|图形模式。int SetGraphicsMode(HDC hdc, int iMode)Q?br />该函数用指定的方式修改与讑֤环境有关的全局转换。BOOL ModifyWorldTransform(HDc hdc, CONST XFORM *lpXform, DWORD iMode)Q?/p>
四、hPen = ExtCreatePen (iStyle, iWidth, &lBrush, 0, NULL) ;使用该函数正常地l制U段?/p>
五:轨迹
BeginPath {路径开始}
EndPath {路径l束}
StrokePath {l制路径}
FillPath {填充路径}
StrokeAndFillPath {l制q填充\径}
SelectClipPath 路径的运?br />//在\径中可以使用的图形命令有:
AngleArc
Arc
ArcTo
Chord
CloseFigure
Ellipse
ExtTextOut
LineTo
MoveToEx
Pie
PolyBezier
PolyBezierTo
PolyDraw
Polygon
Polyline
PolylineTo
PolyPolygon
PolyPolyline
Rectangle
RoundRect
TextOut
六、字体效?br />
一、设|字体大?br />LOGFONT lf;
ZeroMemory(&lf,sizeof(lf));
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfHeight=m_iMineLength;
lf.lfWidth=m_iMineLength;
lf.lfWeight=1000;
HFONT hFont=CreateFontIndirect(&lf);
HFONT hOldFont=(HFONT)SelectObject(m_hMemDC,hFont);
DeleteObject(hFont);
二、输出透明底色字体
SetBkMode(hMemDc,TRANSPARENT);
TextOut(hMemDc,0,0,sNum,strlen(sNum));
三、居中输?br />DrawText(hdc,str,&rt,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//注意要同时DT_VCENTER|DT_SINGLELINE才能居中
Q?Q画一pd相连的直Uѝ?br />Polyline 把Point数组的点q接成线。不用当前点做开始点Q?br />PolylineTo 使用当前点做开始点Qƈ当前的位置讄成最后一根线的终炏V?br />PolyPolyline dl相q的Uѝ?/p>
(3)填充矩Ş
Rectangle M个矩形,q用白色刷子填充、RectangleQhdc,xleft,ytop,xright,ybottomQ?br />Ellipse M椭圆Qƈ用白色的刷子填充。Ellipse Qhdc,xleft,ytop,xright,ybottomQ?br />RoundRect d角矩形。ƈ用白色的刷子填充 RoundRectQhdc,xL,yT,xR,yB,xC,yCQ?br /> xC,yC是圆角矩形的圆角?br />Arc L圆线。Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd,yEnd)
Chord du弓ŞChord(hdc,xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd)
Pie 画饼形图 Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);
ArcTo 和AngleArc L圆线?/p>
//////多边?br />Polygon(hdc,aptQiCount)Q?nbsp; //M个多边ŞQ最后一点与W一点相q?br />PolyPolygon(hdcQaptQaiCount,iPolyCount); //d个多边Ş?/p>
Q?Q贝塞尔曲线,画贝塞尔曲线
POINY apt??Qv点,W一控制点,W二控制点,l点Q?br />需要注意的是:Q曲U是L到终点的q线曲线Q控制点Q调整点Q不在其中?br />PolyBezier Qhdc,apt,icountQ?br />PolyBezierTo Qhdc,apt,icountQ。用当前点v?br />PolyDraw Mpd相连的线以及贝塞曲Uѝ?br />对于多条贝塞曲U,后一条的L是前一条的l点?/p>
(5)矩Ş函数
FillRect(hdc,&rect,hBrush); //使用指定的画h填充矩ŞQ(不包含(RightQbuttomQFrameRect(hdc,&rect,hBrush);//使用d来填充矩形框Q不填充矩ŞQ?br />InvertRect(hdc,&rect); //使像素翻转,白变黑,黑变白,l变U?/p>
///////对Rect的操?br />SetRect(&rect,xLeft,yTop,xRight,yButtom);//赋?br />OffsetRect(&rect,x,y); //沿xQyUd
InflateRect(&rect,x,y); //增减矩Ş的尺寸?br />SetRectEmpty(&rect); //|?
CopyRect(&A,&B);把B复制到A.
IntersectRect(&A,&B1,&B2);//把B1和B2的交集复制到A.
UnionRect(&A,&B1,&B2); //取ƈ?br />bEmpty=IsRectEmpty(&Rect);//判断矩Ş是否为空?br />blnRect=PtlnRect(&Rect,point); //判断Ҏ否在矩Ş中?br />
二、映像坐?br />
1Q、视口:讑֤坐标Q像素)
H口Q逻辑坐标Q像素、mm、英?br />视口Q设备)坐标转换为窗口(逻辑Q坐标:
公式Q一般不用记Q有专门的函数?br />xWindow=(xViewport - xViewOrg) * xWinExt/xViewExt +xWinOrg
yWindow=(yViewport - yViewOrg) * yWinExt/yViewExt +yWinOrg
(xWindow,yWindow) 转换后的H口坐标
QxViewportQyViewportQ待转换的视口坐?br />(xWinExt,yWinExt)是逻辑座标的视H范_
(xViewExt,yViewExt)是装|标的视窗范围?br />(xWinOrgQyWinOrg)是逻辑座标的窗口原点;
(xViewOrg,yViewOrg)是装|标的视口原点
2Q、设备点转化为逻辑?br />DPtoLP (hdc, pPoints, iNumber);pPoints l构阵列的指标,而iNumber 是要转换的点的个?br />例如Q?br />GetClientRect (hwnd, &rect) ;
DPtoLP (hdc, (PPOINT) &rect, 2) ;
逻辑点{换ؓ装置点:
LPtoDP (hdc, pPoints, iNumber) ;
3):
SetMapMode(hdc,iMapMode); //讄映射方式?br />默认QMM_TEXTQ每个逻辑单位转换Z个图素,X正方向向叻IY正方向向下?br />原点可以改变Q范围不可改?br />SetWindowOrgEx(); //讄讑֤环境的原?br />SetViewprocOrgEx(); //讄客户Z?br />//
//原点和范围都可以改变?br />MM_ANISOTROPICQ逻辑单位转换成具有Q意比例u的Q意单位,用SetWindowExtExSetViewportExtEx函数可指定单位、方向和比例?/p>
//原点可以改变Q范围不可以改变QX的正斚w向右QY的正方向向上?br />MM_HIENGLISHQ每个逻辑单位转换?.001英寸QX的正斚w向右QY的正方向向上?br />MM_HIMETRICQ每个逻辑单位转换?.01毫米QX正方向向叻IY的正方向向上?br />MM_ISOTROPICQ逻辑单位转换成具有均{比例u的Q意单位,xX轴的一个单位等于沿Y轴的一个单位,用和函数可以指定该u的单位和方向。图形设备界面(GDIQ需要进行调_以保证X和Y的单位保持相同大(当设|窗口范围时Q视口将被调整以辑ֈ单位大小相同Q?br />MM_LOENGLISHQ每个逻辑单位转换?.01英寸QX正方向向叻IY正方向向上?br />MM_LOMETRICQ每个逻辑单位转换?.1毫米QX正方向向叻IY正方向向上?br />MM_TWIPSQ每个逻辑单位转换为打印点?Q?0Q即1Q?400英寸Q,X正方向向叻IY方向向上?br />
ȝ、刷子、位图、区域、字体、调色板是可以创建的6UGDI对象?br />GetStockObject(obj);获取对象的句柄?br />DeleteObject(obj); 删除对象。(注意不能在有效的讑֤描述表中删除。)
除调色板外,其他对象都是通过SelectObject(hdc,obj);选入讑֤描述表中?br />GetObject(HOBJ,size,lpObj); lpObj可以是下列的l构体。获取对象信息?br />BITMAP //位图
DIBSECTION //位图
EXTLOGPEN //ȝ
LOGBRUSH //?
LOGFONT //字体
LOGPEN //ȝ
Q?Q画W(PenQ?windows的默认|BLACK_PEN
创徏Q?br />Ҏ一QhPen=CreatePenQiPenStyle,iWidth,crColorQ?
iPenStyle的参敎ͼPS_SOLID 实心ȝ
PS_DASH 破折LW(在iWidth<1有效Q否则系l会用实心笔替代Q?br /> PS_DOT 虚线Q在iWidth<1有效Q否则系l会用实心笔替代Q?br /> PS_DASHDOT 点划U(在iWidth<1有效Q否则系l会用实心笔替代Q?br /> PS_DASHDOTDOT 双重点划U(在iWidth<1有效Q否则系l会用实心笔替代Q?br /> PS_NULL I白W?br /> PS_INSIDEFRAME _实U,当iWidth>1可以使用抖动Ԍ不只是纯Ԍ
Ҏ二:LOGPEN logpen //指定W颜艌Ӏ大、类型的l构体。同上?br /> hPen=CreatePenIndirect(&logpen);
Q?Q字体(FontQ?默认|SYSTEM_FONT
创徏Q?br />一QCreateFont
只用?个参敎ͼ其他都ؓ0Q例QCreateFont (0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)
HFONT CreateFont(
int nHeight, // 字符宽度Q逻辑单位
int nWidth, //
int nEscapement, // 斜放|字W串
int nOrientation, // 字符倾斜的角度,影响单个字符
int fnWeight, // _体?—400标准Q?00_体
DWORD fdwItalic, // 斜体
DWORD fdwUnderline, // 下划U?br /> DWORD fdwStrikeOut, // 删除U?br /> DWORD fdwCharSet, // 1为默认倹{指定字体字W集一个字节的|*不用理会Q?br /> DWORD fdwOutputPrecision, // 输出_ֺ*
DWORD fdwClipPrecision, // 裁剪_ֺ*
DWORD fdwQuality, // 期望匚w字体*
DWORD fdwPitchAndFamily, // 字体?
LPCTSTR lpszFace // 字样*
);
字体Q?br />SYSTEM_FONT
SYSTEM_FIXED_FONT
OEM_FIXED_FONT
ANSI_FIXED_FONT?br />ANSI_VAR_FONT
DEVICE_DEFAULT_FONT
其中: WM_INPUTLANGCHANGE: dwCharSet = wParam ;
二:LOGFONT logfontQ?br /> CreateFontIndirectQ?amp;logfontQ;
Q?Q刷子(BrushQ?默认?:WHITE_BRUSH
pȝ的刷子: WHITE_BRUSH
LTGRAY_BRUSH 亮灰
GRAY_BRUSH ?br /> DKGRAY_BRUSH 黑灰
BLACK_BRUSH
创徏Q?br />一QhBrush=CreateSolidBrush(crColor);
二:hBrush=CreateHatchBrush(iHatchStyle,crColor);//创徏有媄U的刷子填充部分为阴?br />其中QiHatchStyle的参数如下:
HS_BDIAGONAL 45度的斜线?br /> HS_CROSS 十字型的Uѝ?br /> HS_DIAGCROSS ×?br /> HS_FDIAGONAL 135度斜U?br /> HS_HORIZONTAL 水^
HS_VERTICAL 垂直
三:LOGBRUSH logbrush
CreateBrushIndirectQ?amp;logbrushQ;
四: hBrush=CreatePatternBrush(HBITMAP hbmp);//创徏位图的刷子?br />五:hBrush=CreateDIBPatternBrushPtQ?/创徏DIB位图的刷子?br /> CreateDIBPatternBrush,
Q?Q位图(BitmapQ默认|NoneQ无Q;
CreateBitmap,
CreateBitmapIndirect,
CreateCompatibleBitmap,
CreateDIBitmap,
CreateDIBSection
CreateSolidBrush
W一U:Q?br />HBITMAP CreateBitmap(
int nWidth, // ?br /> int nHeight, // ?br /> UINT cPlanes, // 颜色板的数目
UINT cBitsPerPel, // 没像素的位数?br /> CONST VOID *lpvBits // 指向颜色数据数组指针。这些颜色数据用来设|矩形区域内像素的颜艌Ӏ矩形区域中的每一扫描U必L双字节的整数倍(不部分?填充Q。如果该参数为NULLQ那么就表示没有定义C图?br />);
//化版
HBITMAP CreateCompatibleBitmap( HDC hdc, int nWidth, int nHeight );
//W二U?br />HBITMAP CreateBitmapIndirect(&bitmap);bitmap是BITMAPl构?/p>
Q?Q区域(RegionQ区域是ҎC器上一个范围的描述Q这个范围是矩Ş、多边Ş和椭圆的l合Q把区域选进讑֤描述表,区域可以用于l制和剪裁?br />作用QiRgnType=CombineRgn(hRgn,hRgn1,hRgn2,iCombine);
iCombine的参敎ͼ
RGN_AND 两个源区域的公共部分
RGN_OR 全部
RGN_XOR 除去公共部分?br />RGN_DIFF hRgn1不在hRgn2的部?br />RGN_COPY hRgn1的全部。(忽略hRgn2Q;
iRgnType的参敎ͼ
NULLREGION 得到I区?br />SIMPLEREGION 得到单的矩Ş、椭圆或多边?br />COMPLEXREGION 多个多边形、矩形、椭圆的l合
ERROR 出错
创徏Q?br />一Q创建矩形区域:
hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;
hRgn = CreateRectRgnIndirect (&rect) ;
二: 创徏椭圆剪裁区域;
hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;//
hRgn = CreateEllipticRgnIndirect (&rect) ;
三;创徏多边形剪裁区?br /> hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;
///////////////////////////////////////////////////////////
矩Ş与区域的剪裁
对于矩Ş;
InvalidateRect (hwnd, NULL, TRUE) ;//使矩形无?br />GetUpdateRect 来取得失效矩形的座标或WM_PAINT中从PAINTSTRUCTl构中得?br />ValidateRect使有?br />对于区域:
InvalidateRgn (hwnd, hRgn, bErase) ;
ValidateRgn (hwnd, hRgn) ;
SelectObject(hdc,hRgn); 或SelectClipRgn(hdc,hRgn);选进讑֤描述?br />ExcludeClipRect用於一个矩形从剪裁区域里排除掉Q?br />IntersectClipRect 用於建立一个新的剪裁区域,它是前一个剪裁区域与一个矩形的交,OffsetClipRgn 用於剪裁区域移动到昄区域的另一部分?br />
理解1Q设备描q表中包含许多确定的GDI函数如何在设备上工作的当前属性。这些属性允怼递给GDI函数的参数只包含其实坐标或者尺怿息,而不包含Windows在设备上昄对象旉要的所以其他信息?/p>
理解2Q一个设备描q表通常指一个物理显C备。如视频昄器或打印机?/p>
理解3Q设备描q表Q简UDCQ实际上是GDI内部保存的数据结构。有些值是囑Ş化的“属?#8221;Q这些属性定义了一些GDIl图函数的工作,例如Q文本颜Ԍ文本的背景、TextOut函数的X坐标Qy坐标映射到窗口客户区的方式,q有windows昄的字体?/p>
//////////////////////////////////获取句柄hdc
(1)注意q不能无效区域变的有效
hdc=GetDC(hwnd);
//////
ReleaseDC(hwnd,hdc);
(2)在处理WM_PAINT消息使用。能使无效区域变的有效、重l?br />hdc=BeginPaint(hwnd,&ps);
/////////
EndPaint(hwnd,&ps);
Q?Q能获得非客户区的绘制消息。包括窗口的标题栏,菜单栏,和滚动条、框架等?br />在WM_NCPAINT中处理?br />hdc=GetWindowDC(hwnd);
//////
ReleaseDC(hwnd,hdc);
Q?Q通用获得DC的方法。视频显C器或者打印机上的DC.
hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); //获得整个屏幕的dc
//////////////
DeleteDC(hdc);
Q?Q获得一个dcQ其参数与CreateDC的参数相同。但是不能用q个信息环境句柄往讑֤描述表上写东ѝ?///特别 注意?br />hdc=CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
/////////
DeleteDC (hdc);
Q?Q可以把位图选进内部讑֤描述表。然后用GDI 函数在位图上l画?br />hdcMem=CreateCompatibleDC(hdc); //位图选进内部讑֤描述?br />///////////
DeleteDC (hdcMem);
Q?Q获取元文g的设备描q表来创建元文g?br />hdcMeta=CreateMetaFile(pszFilename);
//////////
hmf=ColseMetaFile(hdcMeta)
/////////////////////获取信息
Q?Q获取视频显C器的尺寸,色彩{信息?br />int iValue=GetDeviceCaps(hdc,ilndex);
///////////////////保存讑֤描述表?br />(9)
SaveDC(hdc);可以保存多次
RestoreDC(hdc,-1);恢复DC
1\一些空间隔的填充。如点和虚线之间的间隔填充?br />背景模式Q用SetBkMode(hdc,iBkMode)修改
Q?QOPAQUE(pȝ默认?Q间隔用背景颜色填充?br /> 修改QSetBkColor(hdc,crColor); //修改背景?br /> GetBkColor(hdc); 获取背景?br />Q?QTRANSPARENT 不填充间?,不擦除背景,透明模式
2\l图方式Q?br />用画W进行绘囑֮际是ȝ像素与目标位|处原来像素之间的某U布D?br />默认|QR2_COPYPEN;
修改Q?br />SetROP2(hdc,iDrawMode);
获取Q?br />iDrawMode=GetROP2(hdc);
蝴蝶桩是现在机动车驾驶培训的重要内容Q一般考试旉驶者只需要用方向盘和最基本的档位控制功能(一挡、倒R挡)Q当然还包括刹R和离合控制器Q请采用2D?/span>3D的图形界面模拟驾驶员基本蝴蝶桩训l时候的全过E。徏议采用键盘、鼠标或游戏杆的方式控制模拟机动车操?/span> q过2D画面反映车辆和R库的q面位置关系?br />作品介绍Q?br />
E序界面有四大模块:
1、操作控?nbsp; 分别对应键盘上的ADWS键,或用鼠标点击
2、演C控?nbsp; 设计相应的步骤演C?br />3、R模型 独立与界面外Q却依存在界面运动中
4、界面提C?nbsp; 步骤提示Q和没一步对应相应的轨迹
设计要点Q?br />1、R的{弯或UdQ其实R子本w是一个窗口,分别用了36张图片表CZ同角度的UdQR子外使用透明颜色。用API函数movewindowq不能完全解决问题,主要是不能控制移动的距离?br />2、演C的步骤Q基于判断点位置的移动,讄?2个不可见参考点Q当车子刚要接触参考点时改变轨qV?br />3、目标:当用户用Y件时Q免除查找资?/span>
更多蝴蝶桩仿真,讉KQ?a >http://blog.sina.com.cn/s/blog_62ea3be40100trtp.html
作品下蝲Q?a href="/Files/Cass/cardrive.rar">/Files/Cass/cardrive.rar
2、DTM_GETMCCOLOR //获得日历旉控g的日历子H口的颜艌Ӏ?br> wParam = (WPARAM)(INT)iColor; //
lParam = 0;
iColor; 的|
MCSC_BACKGROUND 索月份之间的背景颜色昄出来?
MCSC_MONTHBK MCSC_MONTHBK 背景颜色索在本月内显C出来?
MCSC_TEXT MCSC_TEXT 索用于显C在一个月内文本的颜色?
MCSC_TITLEBK MCSC_TITLEBK 索背景颜色在日历的标题显C出来?
MCSC_TITLETEXT MCSC_TITLETEXT .索用来显C在日历的标题文字的颜色?
MCSC_TRAILINGTEXT MCSC_TRAILINGTEXT 索用的颜色来显C头一天和后一天的文本头和N天数׃前的和随后的几个月里Q关于当前月份的日历出现的日子?
q回COLORREF Q?br>3、DTM_GETMCFONT //获得日历旉控g的日历子H口的字?br> wParam = 0;
lParam = 0;
4、DTM_GETRANGE //取得日历旉控g的最大和最时?br> wParam = 0;
lParam = (LPARAM) lpSysTimeArray;
q回一个DWORD|它是GDTR_MAXl合GDTR_MIN或。第一个元素SYSTEMTIME数组包含最低限度的旉W二个元素的数组的SYSTEMTIME包含的最大的允许旉?/p>
5、DTM_GETSYSTEMTIME //目前的时_和填充systime指针
wParam = 0;
lParam = (LPARAM) lpSysTime;
q回|
q回一?DWORD|{于GDT_VALID如果旉信息被成功结构放|在指定?
或消息可以返回GDT_NONE如果控制被设|ؓDTS_SHOWNONE风格和控制复选框未被选中?
6、DTM_SETFORMAT //讄日期旉选择器的格式
wParam = 0;
lParam = (LPARAM) lpszFormat;
预设的格式有三种可供昄的日期和旉的显C?br>DTS_LONGDATEFORMAT 昄是q样的:“星期五,1996q??9?#8221;?nbsp;
DTS_SHORTDATEFORMAT 昄是q样的:“4/19/96”?nbsp;
DTS_SHORTDATECENTURYFORMAT 昄是q样的:“1996q??9?#8221;?nbsp;
DTS_TIMEFORMAT DTS_TIMEFORMAT 昄是q样的:“下午五时31?2U?#8221;?nbsp;
日期和时间格式元素将被替换ؓ实际的日期和旉他们被定义ؓ以下l的字符?nbsp;
"d" 一个或两个数字的日期?
"dd" q两个数字的日期。单数天数的前面加一个零?
"ddd" 三个字符的星期几的羃写?
"dddd" 完整的星期名U?br>"h" ?2时格式的一位或两位数小时?
"hh" ?2时格式的两位数时.一位数数值前面加一个零?
"H" ?4时格式的一位或两位数小时?br>"HH" ?4时格式的两位数时。一位数数值前面加一个零
"m" 一个或两位数分?br>"mm" q两个数字的分钟?一位数数值前面加一个零?br>"M" 一个或两个数字的月份数?br>"MM" q两个数字的月䆾数?一位数数值前面加一个零?
"MMM" q三个字W的月䆾~写?
"MMMM" 完整的月份名U?
"t" 单字母AM / PM~写Q即上午?#8220;A”昄Q?br>"tt" q两个字母的AM / PM~写Q即上午?#8220;AM”昄Q?
"X" //Q?
"y" q䆾的最后一个数?(?996q将作ؓ“6”昄).
"yy" 最后两位数字的q䆾Q即1996q将作ؓ“96”昄Q?
"yyy" 完整的年份(?996q将作ؓ“1996q?#8221;昄Q?
7、DTM_SETMCCOLOR //讄日期旉选择器的日历控g颜色Q返回先前的颜色
wParam = (WPARAM)(INT) iColor;
lParam = (LPARAM)(COLORREF) clr;
8、DTM_SETMCFONT //讄日期旉选择器的日历控g字体QfRedraw是是否立即重l?br> wParam = (WPARAM)(HFONT) hFont;
lParam = (LPARAM) MAKELONG(fRedraw, 0);
9、DTM_SETRANGE //讄旉的最大最?br> wParam = (WPARAM) flags;
lParam = (LPARAM) lpSysTimeArray;
10DTM_SETSYSTEMTIME //讄旉。参考DTM_GETSYSTEMTIME
wParam = (WPARAM) flag;
lParam = (LPARAM) lpSysTime;
////////////////////////月历控g
1、创?H口cMONTHCAL_CLASS 使用SetWindowPos改变大小
2、风|
MCS_DAYSTATE //标记选择的日期。有黑体阴媄
MCS_MULTISELECT //选中范围
MCS_WEEKNUMBERS //昄周数
MCS_NOTODAYCIRCLE //不圈今天
MCS_NOTODAY //不显CZ?br>MCS_NOSELCHANGEONNAV
MCS_NOTRAILINGDATES
MCS_SHORTDAYSOFWEEK
3、通知消息Q?/p>
Q?QMCM_GETCOLOR //获得颜色
wParam = (WPARAM)(INT)iColor;
lParam = 0;
iColor的|
MCSC_BACKGROUND //月之间的背景
MCSC_MONTHBK //背景
MCSC_TEXT //字体.
MCSC_TITLEBK //标题
MCSC_TITLETEXT //标题
MCSC_TRAILINGTEXT //
Q?QMCM_GETCURSEL //获得当前选中的日?br> wParam = 0;
lParam = (LPARAM) (LPSYSTEMTIME) lpSysTime;
Q?QMCM_GETFIRSTDAYOFWEEK //获得一个月的第一?br> wParam = 0;
lParam = 0;
Q?QMCM_GETMAXSELCOUNT //获得最大最时间的范围
wParam = 0;
lParam = 0;
Q?QMCM_GETMAXTODAYWIDTH //获得今天的宽?br> wParam = 0;
lParam = 0;
Q?Q?br>MCM_GETMINREQRECT //索所需的最尺寸显C在月历控制整整一个月?br> wParam = 0;
lParam = (LPARAM) (LPRECT) lpRectInfo;
Q?QMCM_GETMONTHDELTA //索滚动月历控制率?滚动速度的月?br> wParam = 0;
lParam = 0;
Q?QMCM_GETMONTHRANGE //获取最新的信息Q用SYSTEMTIMEl构Q表C月历控件的昄的上限和下限的?br> wParam = (WPARAM)(DWORD) dwFlag;
lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;
Q?QMCM_GETRANGE //索一个月日历控g讄最和最大允许的日期?br> wParam = 0;
lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;
Q?0QMCM_GETSELRANGE //获取最C息,表示日期的上限和下限范围目前q户选择?br> wParam = 0;
lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;
Q?1Q?//索作?#8220;今天”指定月历控制日期的信息?br>MCM_GETTODAY
wParam = 0;
lParam = (LPARAM)(LPSYSTEMTIME) lpToday;
Q?2QMCM_GETUNICODEFORMAT //获得格式
wParam = 0;
lParam = 0;
Q?3QMCM_HITTEST //军_了一个月历控刉分是在屏q上的一个特定点
wParam = 0;
lParam = (LPARAM)(PMCHITTESTINFO) pMCHitTest;
Q?4QMCM_SETCOLOR //讄颜色
wParam = (WPARAM)(INT) iColor;
lParam = (LPARAM)(COLORREF) clr;
Q?5QMCM_SETCURSEL //讄选中
wParam = 0;
lParam = (LPARAM)(LPSYSTEMTIME) lpSysTime;
Q?6QMCM_SETDAYSTATE //集目前所有月份的日历控g在一个月内每天可见的状态?br> wParam = (WPARAM) iMonths;
lParam = (LPARAM)(LPMONTHDAYSTATE) lpDayStateArray;
Q?7QMCM_SETFIRSTDAYOFWEEK //讄W一?br> wParam = 0;
lParam = (LPARAM)(INT) iDay;
Q?8QMCM_SETMAXSELCOUNT //讄可以选择的最大天?br> wParam = (WPARAM)(INT) iMax;
lParam = 0;
Q?9QMCM_SETMONTHDELTA //讄滚动的月?br> wParam = (WPARAM)(INT) iDelta;
lParam = 0;
Q?0QMCM_SETRANGE //讄最大最的选择范围
wParam = (WPARAM)(SHORT) fWhichLimit;
lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;
(21)MCM_SETSELRANGE //讄了一个月的日历控件到一个指定日期范围内选择
wParam = 0;
lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;
(22)MCM_SETTODAY //讄今天
wParam = 0;
lParam = (LPARAM)(LPSYSTEMTIME) lpSysTime;
Q?3QMCM_SETUNICODEFORMAT //讄格式
wParam = (WPARAM)(BOOL)fUnicode;
lParam = 0;
Q?4Q?MCM_GETCALENDARBORDER //获得Ҏ
单的创徏ҎQ?br>hThread = _beginthread (ThreadProc, uiStackSize, pParam) ; //创徏
void __cdecl ThreadProc (void * pParam) ; //处理函数
_endthread () ; //l束U程
每个q程中访问界资源的那段代码UCؓ临界?br>CRITICAL_SECTION cs ;
InitializeCriticalSection (&cs) ; //初始?br>EnterCriticalSection (&cs) ; //q入临界?br>LeaveCriticalSection (&cs) ; //d临界?br>DeleteCriticalSection (&cs) ; //删除临界?/span>
PostMessage
该函数将一个消息放入(寄送)C指定H口创徏的线E相联系消息队列里,不等待线E处理消息就q回Q是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得?br>函数原型QB00L PostMessageQHWND hWndQUINT MsgQWPARAM wParamQLPARAM lParamQ?br>事g对象Q?br>Q?Q、hEvent = CreateEvent ( &sa, fManual, fInitial, pszName) ;
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属?br>BOOL bManualReset, // 复位方式
BOOL bInitialState, // 初始状?br>LPCTSTR lpName // 对象名称
);
bManualResetQ?br> [输入]指定事件对象创建成手动复原q是自动复原。如果是TRUEQ那么必ȝResetEvent函数来手工将事g的状态复原到无信L态。如果设|ؓFALSEQ当事g被一个等待线E释放以后,pȝ会自动事件状态复原ؓ无信L?/span>
bInitialStateQ?br> [输入]指定事g对象的初始状态。如果ؓTRUEQ初始状态ؓ有信L态;否则为无信号状态?/p>
Q?Q、SetEvent (hEvent) ; //讄事g的状态的标记
Q?QResetEvent (hEvent) ; //复位事g
Q?QWaitForSingleObject (hEvent, dwTimeOut) ; //{待
2?br>typedef struct tagMDICREATESTRUCT { // mdic
LPCTSTR szClass;
LPCTSTR szTitle;
HANDLE hOwner;
int x;
int y;
int cx;
int cy;
DWORD style;
LPARAM lParam;
} MDICREATESTRUCT;
要有一个显C文档列表的菜单
3、消息:
ȝ口:不处理的消息Qreurn DelFrameProc(hwnd,hwndClient,message,wParam,lParam);
子文档窗口:不处理的消息Q?return DefMDIChildProc (hwnd, message, wParam, lParam) ;
(1)
WM_MDICREATE //应用E序通过发?WM_MDICREATE创徏一个文?br>wParam = 0; // not used; must be zero
lParam = (LPARAM) (LPMDICREATESTRUCT) lpmdic; // creation data
(2)
WM_MDIGETACTIVE //客户区通过发送WM_MDIGETACTIVE获得zd子窗口的句柄
wParam = 0; // not used; must be zero
lParam = (LPBOOL) lpfMaximized; // optional pointer to maximized state flag
(3)
WM_QUERYENDSESSION //其lParam参数可以区分是否关闭
nSource = (UINT) wParam; // 未用
fLogOff = lParam
q回true表示l结Qfalse表示未终l?/p>
Q?Q?br>WM_MDIDESTROY //发送给客户区结束子文档
wParam = (WPARAM) (HWND) hwndChild; // handle to child to close
lParam = 0;
Q?Q?br>WM_MDITILE //以^铺方式重新排列文档?br>wParam = (WPARAM) (UINT) fuTile; // tiling flag
lParam = 0;
(6)
WM_MDICASCADE //以层叠方式重新排列文?br>wParam = (WPARAM) (UINT) fuCascade; // cascade flag
lParam = 0;
(7)
WM_MDIICONARRANGE //重新排列所有最化的文?br>wParam = 0; // not used; must be zero
lParam = 0; // not used; must be zero
(8)当窗口变成活动或非活动的Q都接收此此消息
WM_MDIACTIVATE //ȝ口接收时Q得C个活动子H口
// Message sent to MDI client
wParam = (WPARAM) (HWND) hwndChildAct; // 讑֮zd子窗口的句柄
lParam = 0; // not used; must be zero
//子文档窗口接收时Q?br>// Message received by MDI child
hwndChildDeact = (HWND) wParam; // 失去zd的窗?
hwndChildAct = (HWND) lParam; // 接受zd的窗?
Q?Q?br>WM_MDISETMENU //讄ȝ口的菜单?br>wParam = (WPARAM) (HMENU) hmenuFrame; // handle to frame menu
lParam = (LPARAM) (HMENU) hmenuWindow; // handle to Window menu Q加入新文档列表的菜?br>Windows会在该菜单项上自动添加?/p>
Q?0Q注意:像WM_CHILDACTIVATE 、WM_GETMINMAXINFO 、WM_MENUCHAR 、WM_MOVE 、WM_SETFOCUS 、WM_SIZE 和WM_SYSCOMMAND。要传给DefMDIChildProc处理。故Q在q些消息后用breakQ而不return?/p>
Q?1Q不常用到的
WM_MDIRESTORE = $0223; //E序 发送此消息lMDI客户H口让子H口从最大最化恢复到原来大?br>WM_MDINEXT = $0224; //E序 发送此消息lMDI客户H口ȀzM一个或前一个窗?br>WM_MDIMAXIMIZE = $0225; //E序发送此消息lMDI客户H口来最大化一个MDI子窗口;
4、加速键的消息@?br> while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
!TranslateAccelerator (hwndFrame, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
/////////才掌握,发现现在大多数公叔R弃用啦。可惜啊Q可惜啊?/p>