??xml version="1.0" encoding="utf-8" standalone="yes"?> 本文?/span>VC6.0对话框应用程序ؓ例,当鼠标在按钮上移动、按下或者弹h昄按钮功能提示文本Q本文将在按钮上昄功能提示文本Q?font face="Times New Roman">“IT知道|?/font>”?/font> return CDialog::PreTranslateMessage(pMsg); GDI+是Windows XP中的一个子pȝQ它主要负责在显C屏q和打印讑֤输出有关信息Q它是一l通过C++cd现的应用E序~程接口。顾名思义QGDI+是以前版本GDI的承者,Z兼容性考虑QWindows XP仍然支持以前版本的GDIQ但是在开发新应用E序的时候,开发h员ؓ了满_形输出需要应该用GDI+Q因为GDI+对以前的Windows版本中GDIq行了优化,q添加了许多新的功能?/p> 遗憾的是QVC6.0q不能直接用GDI+Q下面介l一U很方便的在VC6.0中用GDI+的方法。步骤如下: 1.GDI+.rar其中的Includes和Lib中的文g拷到vc目录下的Includes和Lib文g夹中Q?/p> GDI+ for VC6.0 SDK下蝲地址Q?/p> http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip 2.在你要使用GDI+的工E中Q完成初始化工作Q?/p> 以下代码加入StdAfx.h头文件中Q?/p> //加入的头文g #ifndef ULONG_PTR //gdi+用到的两个变?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "> GdiplusStartupInput m_gdiplusStartupInput; 4在程序退出部分前加入 //卸蝲gdi+ 5在Project->stting->Link->Object/libary中加入gdiplus.lib q样你的工程可以用GDI+了,没什么技术含量吧! 另外一U就是用
?font face="Times New Roman">CXXXDlg.h文g中定义:
public:
CToolTipCtrl m_openToolTip;
?font face="Times New Roman">CXXXDlg.cpp?/font>OnInitDialog()中初始化Q?nbsp;
m_openToolTip.Create(this);
m_openToolTip.AddTool( GetDlgItem(IDC_BOTTON), "IT知道|?/font>" );
m_openToolTip.SetDelayTime(200);
m_openToolTip.SetTipTextColor( #0000ff );
m_openToolTip.SetTipBkColor( #ffffff);
m_openToolTip.Activate(TRUE);
重蝲函数PreTranslateMessage
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MOUSEMOVE:
m_openToolTip.RelayEvent(pMsg);
}
}
]]>
GetClientRect() 得到的是在客户区坐标pM的RECTQ即以所在窗口左上角为原点,L了标题栏计算Q仅仅是个大,q回值的左上角永qؓ0Q?Q?
ScreenToClient() 是把屏q坐标系下的RECT坐标转换为客户区坐标pM的RECT坐标?br>
void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
参数
x指定了CWnd的左边的C|?
y指定了CWnd的顶部的C|?
nWidth指定了CWnd的新宽度?
nHeight指定了CWnd的新高度?
bRepaint指定了是否要重画CWnd。如果ؓTRUEQ则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如?
q个参数为FALSEQ则不会发生Mcd的重L作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWndUd而露出的父窗口的M部分。当
q个参数为FALSE的时候,应用E序必须明确CCWnd和父H口中必重ȝ部分无效或重甅RlpRectCRect对象或RECTl构Q指定了新的
大小和位|。说明这个函数改变窗口的位置和大。对于顶层的CWnd对象Qx和y参数是相对于屏幕的左上角的。对于子对象Q它们是相对于父H口客户区的?
上角的?
MoveWindow函数发送一条WM_GETMINMAXINFO消息。处理这个消息时QCWnd得到一个改变最大和最的H口~省值的Z。如果传?
lMoveWindow成员函数的参数超q了q些|则在WM_GETMINMAXINFO处理函数中可以用最或最大值来代替q些倹{?
CWnd::SetWindowPosBOOL SetWindowPos( const CWnd*
pWndInsertAfter, int x, int y, int cx, int cy,UINT
nFlags );
q回值如果函数成功,则返回非零|否则q回0?
参数pWndInsertAfter标识了在Z轴次序上位于q个CWnd对象之前的CWnd对象。这个参数可以是指向CWnd对象的指针,也可以是指向?
列值的指针Ql wndBottom
窗口放在Z轴次序的底部。如果这个CWnd是一个顶层窗口,则窗口将失去它的层状态;pȝ这个窗口放在其它所有窗口的底部。l wndTop
窗口放在Z轴次序的剙。l wndTopMost
窗口放在所有非层H口的上面。这个窗口将保持它的层位置Q即使它失去了活动状态。wndNoTopMost
窗口重新定位到所有非层H口的顶部(q意味着在所有的层H口之下Q。这个标志对那些已经是非层H口的窗口没有作用。有兌个函C及这些参数的?
用规则参见说明部分。x指定了窗口左边的C|。y指定了窗口顶部的C|。cx指定了窗口的新宽度。cy指定了窗口的新高度。nFlags指定了大和
位置选项。这个参数可以是下列值的l合Ql SWP_DRAWFRAME 围绕H口dҎQ在创徏H口的时候定义)。l
SWP_FRAMECHANGED
向窗口发送一条WM_NCCALCSIZE消息Q即使窗口的大小不会改变。如果没有指定这个标志,则仅当窗口的大小发生变化时才发?
WM_NCCALCSIZE消息。l SWP_HIDEWINDOW 隐藏H口。SWP_NOACTIVATE
不激zȝ口。如果没有设|这个标志,则窗口将被激zdƈUd到顶层或非顶层窗口组Q依赖于pWndInsertAfter参数的设|)的顶部。l
SWP_NOCOPYBITS
废弃q个客户区的内容。如果没有指定这个参敎ͼ则客户区的有效内容将被保存,q在H口的大或位置改变以后被拷贝回客户区。l
SWP_NOMOVE 保持当前的位|(忽略x和y参数Q。l SWP_NOOWNERZORDER
不改变拥有者窗口在Z轴次序上的位|。l SWP_NOREDRAW
不重d化。如果设|了q个标志Q则不发生Q何种cȝ变化。这适用于客户区、非客户区(包括标题和滚动条Q以及被UdH口覆盖的父H口的Q何部分。当q个
标志被设|的时候,应用E序必须明确地无效或重画要重ȝH口和父H口的Q何部分。l SWP_NOREPOSITION
与SWP_NOOWNERZORDER相同。l SWP_NOSENDCHANGING
防止H口接收WM_WINDOWPOSCHANGING消息。l SWP_NOSIZE 保持当前的大(忽略cx和cy参数Q。l
SWP_NOZORDER 保持当前的次序(忽略pWndInsertAfterQ。l SWP_SHOWWINDOW
昄H口?
调用q个成员函数以改变子H口、弹出窗口和层H口的大、位|和Z轴次序。窗口在屏幕上按照它们的Z轴次序排序。在Z轴次序上处于端的窗口将E序在所
有其它窗口的剙。子H口的所有坐标都是客户坐标(相对于父H口客户区的左上角)。窗口可以被Ud到Z轴次序的剙Q既可以通过?
pWndInsertAfter参数设ؓ&wndTopMostQƈ保没有讄SWP_NOZORDER标志Q也可以通过讄H口的Z轴次序
它位于所有现存的层H口上方。当一个非层H口被设为顶层窗口时Q它拥有的窗口也被设为顶层的。它的拥有者不发生变化。如果顶层窗口被重新定位到Z轴次
序的底部Q?amp;wndBottomQ或M非顶层窗口之后,则它不再是层H口。当层H口被变为非层H口Ӟ它所有的拥有者和它拥有的所有窗
口都被变为非层H口。如果既没有指定SWP_NOACTIVE标志也没有指定SWP_NOZORDER标志Q这意味着应用E序要求H口被同时激zdƈ攑օ
指定的Z轴次序)Q则pWndInsertAfter参数中指定的值将只在下列环境下适用Ql
在pWndInsertAfter参数中既没有指定&wndTopMost也没有指?amp;wndNoTopMost?
q个H口不是zdH口。应用程序不能激zM个非zdH口但同时又不把它带到Z轴次序的剙。应用程序可以没有Q何限制地改变zdH口的Z轴次序。非层H?
口可能拥有一个顶层窗口,但是反之则不成立。Q何被层H口拥有的窗口(例如对话框)都将自己变ؓ层H口Q以保所有被拥有的窗口位于它们的拥有者上
斏V在Windows
3.1或更新的版本中,可以窗口移动到Z轴次序的剙Qƈ通过讄它们的WS_EX_TOPMOST风格而将之锁定在那里。这U顶层窗口即使在失去zd
状态以后也会保持顶层位|。例如,选择WinHelp的Always On
Top命o会帮助H口变ؓ层Qƈ且在你返回应用程序之后它q保持可见。要创徏一个顶层窗口,应在调用SetWindowPos的时候将
pWndInsertAfter参数设ؓ&wndTopMostQ或者在创徏H口的时候设|WS_EX_TOPMOST风格。如果Z轴次序中包含
了Q何具有WS_EX_TOPMOST风格的窗口,则用&wndTopMostUd的窗口将被放到所有非层H口的顶部,但是位于M层H口?
下面。当应用E序ȀzM个不hWS_EX_TOPMOST风格的非zdH口Ӟ该窗口将被移动到所有非层H口的上方,但是位于所有顶层窗口的下方。如
果在调用SetWindowPos的时候pWndInsertAfter参数被设?amp;wndBottomQƈ且CWnd是一个顶层窗口,则该H口
失去层状态(WS_EX_BOTTOM风格被清除)Qƈ且系l将H口攑֜Z轴次序的底部?nbsp;
]]>
#include <comdef.h>//初始化一下com?/p>
#define ULONG_PTR unsigned long*
#include "GdiPlus.h"
using namespace Gdiplus;
#endif
//l束
3.在程序初始化部分加入
ULONG_PTR m_pGdiToken;
//装蝲gdi+
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
GdiplusShutdown(m_pGdiToken);
]]>
---- Ҏ一Q调用CWinAppcȝ成员函数SetDialogBkColor来实现?br>---- 其中函数的第一个参数指定了背景颜色Q第二个参数指定了文本颜艌Ӏ下面的例子是将应用E序对话 框设|ؓ蓝色背景和红色文本,步骤如下Q?br>---- ?新徏一个基于Dialog的MFC AppWizard应用E序ExampleDlg?br>---- ?在CExampleDlgApp ::InitInstance()中添加如下代码:
BOOL CExampleDlgApp: : InitInstance ( )
{
…
CExampleDlgDlg dlg;
m_pMainWnd = &dlg;
//先于DoModal()调用Q将对话框设|ؓ蓝色背景、红色文?br> SetDialogBkColor(#0000ff,#ff0000);
int nResponse = dlg.DoModal();
…
}
---- ~译q运行,此时对话框的背景色和文本色已发生了改变。值得注意的是Q在调用DoModal()之前必须 先调用SetDialogBkColorQ且此方法是改变应用程序中所有的对话框颜Ԍq不能针Ҏ一个指定的?话框?br>---- Ҏ二:重蝲OnPaint()Q即WM_PAINT消息。有关代码如下(以上例工Eؓ准)Q?br>void CExampleDlgDlg::OnPaint()
{
if (IsIconic())
…
else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect,#00ff00); //讄为绿色背?br> CDialog::OnPaint();
}
---- Ҏ三:重蝲OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor)Q即WM_CTLCOLOR消息。具?步骤如下Q以上例工程为准Q:
---- ①在CExampleDlgDlg的头文g中,d一CBrush的成员变量:
class CExampleDlgDlg : public CDialog
{
...
protected:
CBrush m_brush;
...
};
---- ②在OnInitDialog()函数中添加如下代码:
BOOL CExampleDlgDlg::OnInitDialog()
{
...
// TODO: Add extra initialization here
m_brush.CreateSolidBrush(#00ff00); // 生成一l色刷子
...
}
---- ③利用ClassWizard重蝲OnCtlColor(…)Q即WM_CTLCOLOR消息Q?br>HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
/*
** q里不必~写M代码Q?br>**下行代码要注释掉
** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
*/
return m_brush; //q加l色刷子
}
---- Ҏ四:q是重蝲OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor)Q即WM_CTLCOLOR消息?具体步骤如下Q以上例工程为准Q:
---- 步骤①、②同上Ҏ三中的步骤①、②?br>---- 步骤③利用ClassWizard重蝲OnCtlColor(…)Q即WM_CTLCOLOR消息Q时则有些不同:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//在这加一条是否ؓ对话框的判断语句
if(nCtlColor ==CTLCOLOR_DLG)
return m_brush; //q加l色刷子
return hbr;
}
---- ~译q运行即可?br>----
关于如何改变对话框背景颜色的问题Q可能还有很多种不同Ҏ可以实现Q笔者在q仅丑և四种常见
的方法。其中方法三的编E似乎有点不太规范,Ҏ四则要比Ҏ三正l些Q笔者这LҎ举例是ؓ?
拓宽VC~程爱好者特别是初学者的~程思\Q读者可以根据实际情况选用其中的一U。如果再l合《Y?
报?000q第5期中改变对话框上的控仉Ԍ怿会您的MFC应用E序"增色"不少?
{
//可以背景图,d{?br> //return CScrollView::OnEraseBkgnd(pDC);
}
]]>
Step2: d要自l的按钮Qؓ每个按钮d一个位?span lang=EN-US>
Step3: dWM_DRAWITEM 消息的响应函?span lang=EN-US>OnDrawItem实现具体的自l,详细实现方式参考函数实C?span lang=EN-US>
Step4: 本示例是ҎODS_FOCUS状态进行定制。还可以q行其他状态的l制。控件自l只需要记住一?span lang=EN-US>:随时讉KMEASUREITEMSTRUCT数据l构的数据成员是q行自绘的关
在初始化CBitmap对象?/span>,常用Cbitmap::LoadBitmap,卛_下两U?/span>:
BOOL LoadBitmap(LPCTSTR lpszRecourceName);
BOOL LoadBitmap(UINT nIDResource);
MSDN中的说明?/span>:
" q回D用成功时q回非零|否则为?span lang=EN-US>
lpszResourceName指向一个包含了位图资源名字的字W串Q该字符串以nulll尾Q?span lang=EN-US>NIDResource指定位图资源中资源的ID受说明本函数从应用的可执行文件中加蝲?span lang=EN-US>lpszResourceName指定名字或者由nIDResource指定?span lang=EN-US>IDh志的位图资源。加载的位图被附?span lang=EN-US>Cbitmap对象上。如果由lpszResourceName指定名字的对象不存在Q或者没有够的内存加蝲位图Q函数将q回。可以调用函?span lang=EN-US>CgdiObject::DeleteObject删除?span lang=EN-US>LoadBitmap加蝲的位图,否则Cbitmap的析构函数将删除该位囑֯象。警?/span> 在删除位囑֯象之前,要保证它没有被选到讑֤上下文中。在Windows3.1以及以后的版本中Q增加了如下的位图:OBM_UPARROWIORM_DNARROWIOBM_RGARROWIOBM_LFARROWI ......"
刚开始用的时?/span>,我直接把囑փ路径名给?/span> lpszRecourceName,可L不成?/span>.仔细查了E序,也没发现错误.可ؓ什么呢?...CSDN一查才发现问题出在 lpszRecourceName?/span>. lpszRecourceName按字面意思好像是"指向资源的名U字W串",可实际呢?却不是一般理解的盘上的资源文g?/span>,而是VC工程内部已导入的资源?/span>,所以把外部文g的名U赋l它当然不成功了.问题怎么解决?/span>?---?span lang=EN-US>API函数HBITMAP LoadImage("文g?span lang=EN-US>");不过改函数返回的是指?span lang=EN-US>Load囄的句?/span>,所以需要用?span lang=EN-US>CBitmap?span lang=EN-US>AttachҎ:
//直接从外部文件加载图?span lang=EN-US>
HBITMAP bitmap;
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),strFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_backBitmap.DeleteObject();
if(!m_backBitmap.Attach(bitmap))
{
MessageBox("导入背景囑֤?span lang=EN-US>!","提示",MB_OK);
return;
}
****************************************
void CitemView::getBitMap( CDC *pDC )
{
CDC MemDC;
HBITMAP hBmp;
BITMAP bm;
CBitmap Bitmap;
CPoint point( 10, 10);
CString cStr;
//hBmp = (HBITMAP)::LoadImage(NULL,"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
Bitmap.DeleteObject();
Bitmap.Attach( hBmp );
Bitmap.GetObject(sizeof(BITMAP),&bm);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&Bitmap);
pDC->BitBlt(point.x, point.y, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY);
MemDC.DeleteDC();
}
***************************************************
请问LoadBitmap( LPCTSTR lpszResourceName )?span lang=EN-US>lpszResourceName 是指哪个名字
BOOL LoadBitmap(LPCTSTR lpszResourceName);
BOOL LoadBitmap(UINT nIDResource);
nIDResource 是指资源ID
?span lang=EN-US>lpszResourceName是指什么呢
比如Q我创徏了一?span lang=EN-US>BITMAP资源IDB_BITMAP1 ; lpszResourceName是指什么呢Q是盘上的bitmap1.bmp吗,如果是,以下代码Z么是错的?span lang=EN-US>
CBitmap bmp;
bmp.LoadBitmap("d:\\..\\res\\bitmpa1.bmp");
CDC memdc;
BITMAP bmstru;
bmp.GetBitmap(&bmstru);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bmp);
pDC->BitBlt(0,0,bmstru.bmWidth,bmstru.bmHeight,&memdc,0,0,SRCCOPY);
?span lang=EN-US>Notepad打开*.rc文gQ找到类g面一行:
IDB_BITMAP BITMAP "res\\background.bmp"
ҎQ?/span>
Bitmap1 BITMAP "res\background.bmp"
或者,?span lang=EN-US>VC中察看位图资源的属性,其ID栏内改ؓ"Bitmap"Q注意,一定要加引P?/span>
然后调用Q?/span>
bmp.LoadBitmap("Bitmap1");
保证成功?/span>
资源可以用一个整数来标示Q也可以用一个字W串标示。但无论如何Q这?span lang=EN-US>ID都不是指位图文g名。不要将它们h?span lang=EN-US>