(1) 如何通过代码获得应用程序主窗口的 指针?
主窗口的 指针保存在cwinthread::m_pmainwnd中,调用afxgetmainwnd实现。
afxgetmainwnd() ->showwindow(sw_showmaxmized)
//使程序最大化.
(2) 确定应用程序的路径
use getmodulefilename 获得应用程序的路径,然后去掉可执行文件名。
example:
tchar
exefullpath[max_path] // max_path在api中定义了吧,好象是
128
getmodulefilename(null,exefullpath,max_path)
(3) 如何在程序中获得其他程序的 图标?
两种方法:
(1) sdk函数 shgetfileinfo 或使用 extracticon获得图标资源的 handle,
(2) sdk函数 shgetfileinfo 获得有关文件的很多信息,如大小图标,属性, 类型等.
example(1):
在程序窗口左上角显示 notepad图标.
void csampleview:
ondraw(cdc * pdc)
{
if( :: shgetfileinfo(_t("c:\\pwin95\\notepad.exe"),0,
&stfileinfo,sizeof(stfileinfo),shgfi_icon))
{
pdc ->drawicon(10,10,stfileinfo.hicon)
}
}
example(2):同样功能,use extracticon function
void csampleview:: ondraw(cdc *pdc)
{
hicon hicon=:: extracticon(afxgetinstancehandle(),_t
("notepad.exe"),0)
if (hicon &&hicon!=(hicon)-1)
pdc->drawicon(10,10,hicon)
}
说明: 获得notepad.exe的路径正规上来说用getwindowsdirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.
(4) 获得各种目录信息
windows目录: use "getwindowsdirectory"
windows下的system目录: use "getsystemdirectory"
temp目录: use "gettemppath"
当前目录: use "getcurrentdirectory"
请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区后两个相反.
(5) 如何自定义消息
1) 手工定义消息,可以这么写
#define wm_my_message(wm_user+100),
ms 推荐的至少是 wm_user+100
(2)写消息处理函数,用
wparam,lparam返回lresult.
lresult cmainframe::onmymessage(wparam wparam,lparam lparam)
{
temp目录: use "gettemppath"
//加入你的处理函数 irectory"
}
(6) 如何改变窗口的图标?
向窗口发送 wm_section消息。
example:
hicon hicon=afxgetapp() ->loadicon(idi_icon)
assert(hicon)
afxgetmainwnd() ->sendmessage(wm_section,true,(lparam)hicon)
(7) 如何改变窗口的缺省风格?
重载 cwnd:: precreatewindow 并修改createstruct结构来指定窗口风格和其他创建信息.
example: delete "max" button and set original
window's position and size
bool cmainframe:: precreatewindow
(createstruct &cs)
{
cs.style &=~ws_maxinizemox
cs.x=cs.y=0
cs.cx=getsystemmetrics(sm_cxscreen/2)
cs.cy=getsystemmetrics(sm_cyscreen/2)
return cmdiframewnd ::precreatewindow(cs)
}
call function cwnd::
center windows
example(1):
center window( ) //relative to it's parent
// relative
to screen
example(2):
center window(cwnd:: getdesktopwindow( ))
//relative to
application's mainwindow
afxgetmainwnd( ) ->
center window( )
(9) 如何让窗口和 mdi窗口一启动就最大化和最小化?
先说窗口。
在 initstance 函数中设定 m_ncmdshow的取值.
m_ncmdshow=sw_showmaxmized //最大化
m_ncmdshow=sw_showminmized //最小化
m_ncmdshow=sw_shownormal //正常方式
mdi窗口:
如果是创建新的应用程序,可以用mfc appwizard 的advanced 按钮并在mdi子窗口风格组中检测最大化或最小化还可以重载 mdi window 的precreatewindow函数,设置ws_maxmize or ws_minmize
如果从 cmdichildwnd派生,调用 oninitialupdate函数中的 cwnd::show window来指定 mdi child window的风格。
也就是 fixeddialog形式。 windows发送 wm_getmaxmininfo消息来跟踪, 响应它,在 ongetmaxmininfo 中写代码:
(11) 如何使窗口不可见?
很简单,用sw_hide 隐藏窗口,可以结合 findwindow,showwindow控制.
(12) 如何创建一个字回绕的ceditview
重载cwnd : : precreatewindow和修改createstruct结构,关闭ceditview对象的es_autohscroll和ws_hscroll风格位, 由于ceditview : : precreatewindow显示设置cs. style,调用基类函数后要修改cs . style。
bool csampleeditview : : precreatewindow (createstruct&cs)
{
//first call basse class function .
bool bresutl =ceditview : : precreatewindow (cs)
// now specify the new window style .
cs.style &= ~ (es_autohscroll |ws_hscroll)
return bresult
}
(13) 如何使程序保持极小状态?
这么办: 在恢复程序窗体大小时,windows会发送wm_query-open消息,用 classwizard设置成员函数
onqueryopen() ,add following code:
bool cmainframe:: onqueryopen( )
{
return false
}
(14) 移动窗口
调用cwnd : : setwindowpos并指定swp_nosize标志。目的位置与父窗口有关(顶层窗口与屏幕有关)。调用cwnd : : movewindow时必须要指定窗口的大小。
//move window to positoin 100 , 100 of its parent window .
setwindowpos (null, 100 , 100 , 0 , 0 , swp_nosize |swp_noaorder)
(15) 通用控件的显示窗口
mfc提供了几个cview派生的视窗类, 封装了通用控件的功能,但仍然使用工作框文档显示窗口体系结构:ceditview封装了编辑控件,ctreeview保持了树列表控件,clistview封装了列表显示窗口控件,cricheditview可以处理多种编辑控件。
(16) 重置窗口的大小
调用cwnd: : setwindowpos并指定swp_nomove标志, 也可调用cwnd : : movewindow 但必须指定窗口的位置。
// get the size of the window .
crect rewindow
getwindowrect (rewindow )
//make the window twice as wide and twice as tall .
setwindowpos (null , 0 , 0 , rewindow . width ( ) *2,
rewindow . height () * 2,
swp_nomove |swp_nozorder )
(17) 如何单击除了窗口标题栏以外的区域使窗口移动
当窗口需要确定鼠标位置时windows向窗口发送wm_nchittest信息,可以处理该信息使windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可以使用classwizard处理该信息并调用基类函数, 如果函数返回htclient 则表明鼠标在客房区域,返回htcaption表明鼠标在windows的标题栏中。