没有合适的资源?快使用搜索试试~ 我知道了~
vc常识集萃 <br>一些必须熟记于心的东西
资源详情
资源评论
资源推荐
VC 常识(一)2007-11-30
(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)
}
(8) 如何将窗口居中显示?
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 的风格。
(10) 如何限制窗口的大小?
也就是 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 的标题栏中。
UINT CSampleDialog : : OnNcHitTest (Cpoint point )
{
UINT nHitTest =Cdialog: : OnNcHitTest (point )
return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest
}
上述技术有两点不利之处,
其一是在窗口的客户区域双击时,窗口将极大;
其二, 它不适合包含几个视窗的主框窗口。
还有 一种 方法, 当用 户按 下鼠 标 左键 使主框 窗口 认为 鼠标在 其窗 口标 题 上 ,使 用
ClassWizard 在 视 窗 中 处 理 WM_LBUTTODOWN 信 息 并 向 主 框 窗 口 发 送 一 个
WM_NCLBUTTONDOWN 信息和一个单击测试 HTCAPTION。
void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point
)
{
CView : : OnLButtonDow (nFlags , pont )
//Fool frame window into thinking somene clicked
on
its caption bar .
GetParentFrame ( ) —> PostMessage (
WM_NCLBUTTONDOWN ,
HTCAPTION , MAKELPARAM (poitn .x , point .y) )
}
该技术也适用于对话框和基于对的应用程序,只是不必调用
CWnd: :GetParentFrame 。
void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )
{
Cdialog : : OnLButtonDow (nFlags, goint )
//Fool dialog into thinking simeone clicked on its
caption bar .
PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x
, point. y
) )
}
剩余22页未读,继续阅读
huzhenfeng_2008
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0