专注于互联网--专注于架构
最新标签
网站地图
文章索引
Rss订阅
首页
CrazyCoder
原创
翻译
数据库
项目管理
QQ协议开发
开发语言
Web开发
验证码识别
技术综合
服务器
Dig版
标签
Rss订阅
首页
»
博文摘选
» vc用法:VC使用方法汇总 »正文
vc用法:VC使用方法汇总
来源: 发布时间:星期一, 2009年11月30日 浏览:0次 评论:0
VC使用方法汇总
(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)
{
( :: SHGetFileInfo(_T("c:""pwin95""notepad.exe"),0,
&stFileInfo,
(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon)
}
}
Example(2):同样功能,Use ExtractIcon Function
void CSampleView:: _disibledevent=>("NotePad.exe"),0)
(hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon)
}
介绍说明: 获得notepad.exe
路径正规上来说用GetWindowsDirectory
得到, 如果是
win95下
画笔
应该用访问注册表
思路方法获得其路径
要作成
个比较考究
考虑应该全面点.
(4)获得各种目录信息
Windows目录: Use "GetWindowsDirectory"
Windows下
system目录: Use "Get
Directory"
temp目录: Use "GetTempPath"
当前目录: Use "GetCurrentDirectory"
请注意前两个
第
个参数为目录变量名
后
个为缓冲区后两个相反.
(5)如何自定义消息
1) 手工定义消息
可以这么写
#
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_SETICON消息
Example:
HICON hIcon=AfxGetApp
->LoadIcon(IDI_ICON)
ASSERT(hIcon)
AfxGetMainWnd
->SendMessage(WM_SETICON,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=Get
Metrics(SM_CXSCREEN/2)
cs.cy=Get
Metrics(SM_CYSCREEN/2)
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派生,
_disibledevent=>
// Now spec
y the
window style .
cs.style &= ~ (ES_AUTOHSCROLL |WS_HSCROLL)
bResult
}
(13)如何使
保持极小状态?
这么办: 在恢复
窗体大小时
Windows会发送WM_QUERY-OPEN消息
用 ClassWizard设置成员
OnQueryOpen
,add following code:
Bool CMainFrame:: _disibledevent=>
(nHitTest = =HTCLIENT)? HTCAPTION : nHitTest
}
上述技术有两点不利的处
其
是在窗口
客户区域双击时
窗口将极大;
其 2
它不适合包含几个视窗
主框窗口
还有
种思路方法
当用户按下鼠标左键使主框窗口认为鼠标在其窗口标题上
使用ClassWizard在视窗中处理WM_LBUTTODOWN信息并向主框窗口发送
个WM_NCLBUTTONDOWN信息和
个单击测试HTCAPTION
void CSampleView : : _disibledevent=>
// Get the area that needs to be erased .
CRect reClip
pDC—>GetCilpBox (&rcClip)
//Pa
the area.
pDC—> PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY )
//Unselect brush out of device context .
pDC—>SelectObject (pOldBrush )
// Return nonzero to half fruther processing .
TRUE
}
(19)如何改变窗口标题
CWnd : : SetWindowText可以改变任何窗口(包括Control控件)
标题
//Set title for application's
frame window .
AfxGetMainWnd ( ) —> SetWindowText (_T("Application title") )
//Set title for View's MDI child frame window .
GetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame
title")
)
//Set title for dialog's push button control.
GetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button
title ") )
如果需要经常修改窗口
标题(注:Control控件也是窗口)
应该考虑使用半文档化
AfxSetWindowText
该
在AFXPRIV.H中介绍说明
在WINUTIL.CPP中实现
在联机帮助中找不到它
它在AFXPRIV.H中半文档化
在以后发行
MFC中将文档化
AfxSetWindowText
实现如下:
voik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew )
{
itn nNewLen= Istrlen (Ipaz
)
TCHAR szOld [256]
//fast check to see
text really changes (reduces
flash in the
controls )
(nNewLen >_contof (szOld)
|| : : GetWindowText (hWndCrtl, szOld , _countof (szOld) !=nNewLen
|| Istrcmp (szOld , IpszNew)! = 0
{
//change it
: : SetWindowText(hWndCtrl , IpszNew )
}
}
(20)如何防止主框窗口在其介绍说明中显示活动
文档名
创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位
如果不希望在介绍说明中自动添加文档名
必须禁止该风格位
可以使用ClassWizard重置
CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格
BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)
{
//Turn off FWS_ADDTOTITLE in
frame .
cs.styel & = ~FWS_ADDTOTITLE
CMDIFrameWnd : : PreCreateWindow (cs )
}
关闭MDI子窗口
FWS _ADDTOTITLE风格将创建
个具有空标题
窗口
可以
CWnd: : SetWindowText来设置标题
记住自己设置标题时要遵循接口风格指南
(21)如何获取有关窗口正在处理
当前消息
信息
CWnd: : GetCurrentMessage可以获取
个MSG指针
例如
可以使用ClassWizard将几个菜单项处理
映射到
个
中
然后
GetCurrentMessage来确定所选中
菜单项
viod CMainFrame : : _disibledevent=>—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)
//Get po
er to toolbar .
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_TOOLBAR)
(23)如何使能和禁止工具条
工具提示
如果设置了CBRS_TOOLTIPS风格位
工具条将显示工具提示
要使能或者禁止工具提示
需要设置或者清除该风格位
下例通过
CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立
个完成此功能
成员
:
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )
{
ASSERT_VALID (m_wndToolBar)
DWORD dwStyle = m _wndToolBar.GetBarStyle ( )
(bDisplayTips) dwStyle |=CBRS_TOOLTIPS
dwStyle & = ~CBRS_TOOLTIPS
m_wndToolBar.SetBarStyle (dwStyle )
}
(24)如何创建
个不规则形状
窗口
可以使用新
SDK
SetWindowRgn
该
将绘画和鼠标消息限定在窗口
个指定
区域
实际上使窗口成为指定
不规则形状
使用AppWizard创建
个基于对
应用
并使用资源编辑器从主对话资源中删除所在
缺省Control控件、标题以及边界
给对话类增加
个CRgn数据成员
以后要使用该数据成员建立窗口区域
Class CRoundDlg : public CDialog
{
…
private :
Crgn m_rgn : // window region
…
}
修改OnInitDialog
建立
个椭圆区域并
SetWindowRgn将该区域分配给窗口:
BOOL CRoundDlg : : _disibledevent=>BYTE byRed =GetRValue (color)
BYTE byGreen = GetGValue (color)
BYTE byBlue = GetBValue (color)
// get the size of the view window
Crect rect
GetClientRect (rect)
// get minimun number of units
nUnits =min (rect.right , rect.bottom )
//calculate he horiaontal and vertical step size
float fltStepHorz = (float) rect.right /nUnits
float fltStepVert = (float) rect.bottom /nUnits
nEllipse = nUnits/3 // calculate how many to
draw
nIndex
// current ellipse that is being draw
CBrush brush
// bursh used for ellipse fill color
CBrush *pBrushOld // previous
brush that was selected
o dc
//draw ellipse , gradually moving towards upper-right
corner
for (nIndex = 0 nIndes < + nEllipse nIndes
)
{
//creat solid brush
brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ).
( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)
/nEllipse ) ) )
//select brush
o dc
pBrushOld= dc .SelectObject (&brhsh)
//draw ellipse
dc .Ellipse ( (
) fltStepHorz * 2, (
) fltStepVert * nIndex ,
rect. right -( (
) fltStepHorz * nIndex )+ 1,
rect . bottom -( (
) fltStepVert * (nIndex *2) ) +1)
//delete the brush
brush.DelecteObject ( )
}
}
最后
处理WM_NCHITTEST消息
使当击打窗口
任何位置时能移动窗口
UINT CRoundDlg : : _disibledevent=>rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest
}
(25)如何获取应用
例子句柄?
应用
例子句柄保存在CWinApp m_hInstance 中,可以这么
AfxGetInstancdHandle获得句柄.
Example: HANDLE hInstance=AfxGetInstanceHandle
(26)如何编程结束应用
?
这是个很简单又是编程中经常要遇到
问题.
向窗口发送 WM_CLOSE消息,
CWnd::OnClose成员
.允许对用户提示是否保存修改过
数据.
Example: AfxGetMainWindow
->SendMessage(WM_CLOSE)
还可以创建
个自定义
Terminate Window
void Terminate Window(LPCSTR pCaption)
{
CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption)
(pWnd)
pWnd ->SendMessage(WM_CLOSE)
}
介绍说明: FindWindow
不是提倡
做法
它无法处理标题栏自动改变
比如我们要检测 Notepad是不是已运行而事先不知道Notepad
标题栏,这时FindWindow就无能为力了
可以通过枚举 windows任务列表
办法来实现
在机械出版社"Windows 95 API开发人员指南"
书有比较详细
介绍,这里就不再多说乐
(27)如何创建和使用无模式对话框
MFC将模式和无模式对话封装在同
个类中
但是使用无模式对话需要几个对话需要几个额处
步骤
首先
使用资源编辑器建立对话资源并使用ClassWizard创建
个CDialog
派生类
模式和无模式对话
中止是不
样
:模式对话通过
CDialog : : EndDialog 来中止
无模式对话则是
CWnd: : DestroyWindow来中止
CDialog : : _disibledevent=>ASSERT_VALID (pDialog) Destroy ( )
//Create the modeless dialog . represents this dialog.
BOOL bResult = pDialog —> Creste (IDD_IDALOG)
ASSERT (bResult )
}
(28)如何防止主框窗口在其介绍说明中显示活动
文档名
创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位
如果不希望在介绍说明中自动添加文档名
必须禁止该风格位
可以使用ClassWizard重置
CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格
BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)
{
//Turn off FWS_ADDTOTITLE in
frame .
cs.styel & = ~FWS_ADDTOTITLE
CMDIFrameWnd : : PreCreateWindow (cs )
}
关闭MDI子窗口
FWS _ADDTOTITLE风格将创建
个具有空标题
窗口
可以
CWnd: : SetWindowText来设置标题
记住自己设置标题时要遵循接口风格指南
(29)如何在代码中获取工具条和状态条
指针
缺省时
工作框创建状态条和工具条时将它们作为主框窗口
子窗口
状态条有
个AFX_IDW_STATUS_BAR标识符
工具条有
个AFX_IDW_TOOLBAR标识符
下例介绍说明了如何通过
起
CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口
指针:
//Get po
er to status bar .
CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)
//Get po
er to toolbar .
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_TOOLBAR)
(30)怎样加载其他
应用
?
3个SDK
winexec, shellexecute,createprocess可以使用
WinExec最简单
两个参数
前
个指定路径
后
个指定显示方式.后
个参数值得说
下
比如泥用 SW_SHOWMAXMIZED方式去加载
个无最大化按钮
就是Neterm,calc等等
就不会出现正常
窗体
但是已经被加到任务列表里了
ShellExecute较 WinExex灵活
点
可以指定工作目录,下面
Example就是直接打开 c:"temp"1.txt,而不用加载和 txt文件关联
应用
,很多安装
完成后都会打开
个窗口
来显示Readme or Faq,我猜就是这么作
啦.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:""temp"),SW_SHOWMAXMIZED)
CreateProcess最复杂
共有十个参数
不过大部分都可以用NULL代替
它可以指定进程
安全属性
继承信息
类
优先级等等.来看个很简单
Example:
STARTUPINFO stinfo
//启动窗口
信息
PROCESSINFO procinfo //进程
信息
CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,
NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo,&procinfo)
(31)如何在代码中获取工具条和状态条
指针
缺省时
工作框创建状态条和工具条时将它们作为主框窗口
子窗口
状态条有
个AFX_IDW_STATUS_BAR标识符
工具条有
个AFX_IDW_TOOLBAR标识符
下例介绍说明了如何通过
起
CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口
指针:
//Get po
er to status bar .
CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)
(32)如何使能和禁止工具条
工具提示
如果设置了CBRS_TOOLTIPS风格位
工具条将显示工具提示
要使能或者禁止工具提示
需要设置或者清除该风格位
下例通过
CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立
个完成此功能
成员
:
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )
{
ASSERT_VALID (m_wndToolBar)
DWORD dwStyle = m _wndToolBar.GetBarStyle ( )
(bDisplayTips) dwStyle |=CBRS_TOOLTIPS
dwStyle & = ~CBRS_TOOLTIPS
m_wndToolBar.SetBarStyle (dwStyle )
}
//Get po
er to toolbar .
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_TOOLBAR)
(33)如何设置工具条标题
工具条是
个窗口
所以可以在
CWnd : : SetWindowText来设置标题
例子如下:
CMainFrame : : _disibledevent=>
(HBRUSH) m_brush.GetSafeHandle ( )
CFormView : : _disibledevent=>
nReslt = DlgDirListComboBox (szPath, IDC_COMBO , IDC_CURIDIR, DDL_READWRITE |DDL_READONLY|DDL_HIDDEN| DDL_SYSTEM|DDL_ARCHIVE)
TRUE
}
(42)为什么旋转按钮Control控件看起来倒转
需要
CSpinCtrl : : SetRange 设置旋转按钮Control控件
范围
旋转按钮Control控件
缺省上限为0
缺省下限为100
这意味着增加时旋转按Control控件
值由100变为0
下例将旋转按钮Control控件
范围设置为0到100:
BOOL CAboutDlg : : _disibledevent=>ASSERT_VALID (m_pButton)
m_pButton —>Create (_T ("Button Title ") , WS_CHILD |WS_VISIBLE |BS_PUSHBUTTON. Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )
(47)如何限制编辑框中
准许
如果用户在编辑Control控件中只允许接收数字
可以使用
个标准
编辑Control控件并指定新
创建标志ES_NUMBERS,它是Windows 95新增加
标志
该标志限制编辑Control控件只按收数字
如果用户需要复杂
编辑Control控件
可以使用Microsoft
屏蔽编辑Control控件
它是
个很有用
OLE定制Control控件
如果希望不使用OLE 定制Control控件自己处理
可以派生
个CEdit类并处理WM_CHAR消息
然后从编辑Control控件中过滤出特定
首先
使用ClassWizard建立
个 CEdit
派生类
其次
在对话类中指定
个成员变量将编辑Control控件分类在OnInitdialog 中
CWnd: : Sub
DlgItem .
//In your dialog
declaration (.H file )
private : CMyEdit m_wndEdit // Instance of your
edit control .
//In you dialog
implementation (.CPP file )
BOOL CSampleDialog : : _disibledevent=>
//Bypass default _disibledevent=>
//Draw red text for all edit controls .
(nCtlColor= = CTLCOLOR_EDIT )
pDC —> SetTextColor (RGB (255, 0 , 0 , ) )
hbr
}
然而
由于每个父窗口必须处理通知消息并指定每个Control控件
绘画属性
所以
这种思路方法不是完全
面向对象
思路方法
Control控件处理该消息并指定绘画属性更合情合理
消息反射允许用户这样做
通知消息首先发送给父窗口
如果父窗口没有处理则发送给Control控件
创建
个定制彩色列表框Control控件必须遵循下述步骤
首先
使用ClassWizard 创建
个CListBox
派生类并为该类添加下述数据成员
CMyListBox publilc CListBox
{
…
private
COLORREF m_clrFor // foreground color
COLORREF m_clrBack //background color
Cbrush m_brush //background brush
…
}
其次
在类
构造
中
化数据中
CMyListBox : : CMyListBox
{
//Initialize data members .
m_clrFore =RGB (255 , 255 , 0) //yellow text
m_clrBack=RGB (0 , 0 , 255) // blue background
m_brush . CreateSolidBrush (m _clrBack )
}
最后
使用ClassWizard处理反射
WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新
绘画属性
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )
{
pDC—>SetTextColor (m_clrFore)
pDC—>SetBkColor (m_clrBack)
(HBRUSH) m_brush.GetSafeHandle
}
现在
Control控件可以自己决定如何绘画
和父窗口无关
(49)当向列表框中添加多个项时如何防止闪烁
CWnd::SetRedraw 清除重画标志可以禁止CListBox(或者窗口)重画
当向列表框添加几个项时
用户可以清除重画标志
然后添加项
最后恢复重画标志
为确保重画列表框
新项
SetRedraw (TRUE) 的后
CWnd::Invalidate
//Disable redrawing.
pListBox->SetRedraw (FALSE)
//Fill in the list box gere
//Enable drwing and make sure list box is redrawn.
pListBox->SetRedraw (TRUE)
pListBox->Invalidate
(50)如何向编辑Control控件中添加文本
由于没有CEdit:: AppendText
用户只好自己做此项工作
CEdit:: SetSel移动到编辑Control控件末尾
然后
CEdit:: ReplaceSel添加文本
下例是AppendText
种实现思路方法:
void CMyEdit:: AppendText (LPCSTR pText)
{
nLen=GetWindowTextLength
SetFocus
SetSel (nLen, nLen)
ReplaceSel (pText)
}
(51)如何访问预定义
GDI对象
可以通过
CDC:: SlectStockObject使用Windows
几个预定义
对象
诸如刷子、笔以及字体
下例使用了Windows预定义
笔和刷子GDI对象在视窗中画
个椭圆
//Draw ellipse using stock black pen and gray brush.
void CSampleView:: _disibledevent=>
//Draw the ellipse.
pDC->Ellipse (rcView)
//Restore original brush.
pDC->SelectObject (pOrgBrush)
}
(52)如何获取GDI对象
属性信息
可以
GDIObject:: GetObject
这个
将指定图表设备
消息写入到缓冲区
下例创建了几个有用
辅助
//Determine
font is bold.
BOOL IsFontBold (const CFont&font)
{
LOGFONT stFont
font.GetObject (
(LOGFONT), &stFont)
(stFont.lfBold)? TRUE: FALSE
}
//Return the size of a bitmap.
CSize GetBitmapSize (const CBitmap&bitmap)
{
BITMAP stBitmap
bitmap.GetObject (
(BITMAP), &stBitmap)
CSize (stBitmap.bmWidth, stBitmap.bmHeight)
}
//Create a pen with the same color as a brush.
BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush)
{
LOGBRUSH stBrush
brush.Getobject (
(LOGBRUSH), &stBrush)
pen. Createpen (PS_SOLID, 0, stBrush.ibColor)
}
(53)如何实现
个橡皮区矩形
CRectTracker是
个很有用
类
可以通过
CRectTracker::TrackRubberBand 响应WM_LBUTTONDOWN消息来创建
个橡皮区矩形
下例表明使用CRectTracker移动和重置视窗中
蓝色椭圆
大小是很容易
事情
首先
在文件档中声明
个CRectTracker数据成员:
CSampleView : Public CView
{
…
public :
CrectTracker m_tracker
…
}
其次
在文档类
构造
中
化CRectTracker 对象:
CSampleDoc:: CSampleDOC
{
//Initialize tracker position, size and style.
m_tracker.m_rect.SetRect (0, 0, 10, 10)
m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker ::dottedLine
}
然后
在OnDraw
中画椭圆和踪迹矩形:
void CSampleView:: _disibledevent=>ASSERT_VALID (pDoc)
//Select blue brush
o device context.
CBrush brush (RGB (0, 0, 255))
CBrush* pOldBrush=pDC->SelectObject (&brush)
//draw ellipse in tracking rectangle.
Crect rcEllipse
pDoc->m_tracker.GetTrueRect (rcEllipse)
pDC->Ellipse (rcEllipse)
//Draw tracking rectangle.
pDoc->m_tracker.Draw (pDC)
//Select blue brush out of device context.
pDC->Selectobject (pOldBrush)
}
最后
使用ClassWizard处理WM_LBUTTONDOWN消息
并增加下述代码
该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆
大小
void CSampleView::OnLButtonDown (UINT nFlags, CPo
po
)
{
//Get po
er to document.
CSampleDoc* pDoc=GetDocument
ASSERT_VALID (pDoc)
//If clicked _disibledevent=>
//Tracker rectangle changed so update views.
(bResult)
{
pDoc->m_tracker.Track (this,po
,TRue)
pDoc->SetMod
iedFlag
pDoc->UpdateAllViews (NULL)
}
pDoc->m-tracker.TrackRubberBand(this,po
,TRUE)
CView:: _disibledevent=>下例创建了
个8点
Apial字体:
…
CClientDC dc (AqfxGetMainWnd
)
m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, DRAFT_QUALITY, VARIABLE_PITCH | FF-SWISS,_T("Arial"))
(56)如何计算
个串
大小
CDC:: Det text Extent 根据当前选择
字体计算
个串
高度和宽度
如果使用
不是系统字体而是其他字体
则在
GetTextExtent的前将字体选进设备上下文中是很重要
否则计算高度和宽度时将依据系统字体
由此得出
结果当然是不正确
下述样板
当改变下压按钮
标题时动态调整按钮
大小
按钮
大小由按钮
字体和标题
大小而定
响应消息WM_SETTEXT时
OnSetText
该消息使用ON_MESSAE宏指令定义
用户自定义消息
LRESULT CMyButton:: _disibledevent=>//Get title of push button.
CString strTitle
GetWindowText (strTitle)
//Select current font
o device context.
CDC* pDC=GetDc
CFont*pFont=GetFont
CFont*pOldFont=pDC->SelectObject (pFont)
//Calculate size of title.
CSize size=pDC->GetTextExent (strTitle,strTitle.GetLength
)
//Adjust the button's size based _disibledevent=>stFont.
Weight=FW_NORMAL
stFont.
ClipPrecision=LCIP_LH_ANGLES
strcpy (stFont.lfFaceName, "Arial")
//Draw text at 15degree
ervals.
for (
nAngle=0 nAngle<3600 nAngle
150)
{
//Spec
y
angle.
stFont.lfEscapement=nAngle
//Create and select font
o dc.
font.CreateFontIndirect(&stfont)
CFont* pOldFont=pDC ->SelectObject(&font)
//Draw the text.
pDC->SelectObject(pOldFont)
font.DelectObjext
}
}
(58)如何正确显示包含标签
串
GDI文本绘画
时需要展开标签
这可以通过
CDC:: TabbedTextOut或者CDC:: DrawText并指定DT_EXPANDTABS标志来完成
TabbedTextOut
允许指定标签位
下例指定每20设备单位展开
个标签:
void CSampleView:: _disibledevent=>ASSERT_VALID (pDoC)
CString str
str.Format (_T ("Cathy"tNorman"tOliver"))
nTabStop=20 //tabs are every 20 pixels
pDC->TabbedtextOut (10, 10, str, 1, &nTabStop, 10)
}
(59)如何快速地格式化
个CString对象
CString:: Format
该
和pr
f
具有相同
参数
下例介绍说明了如何使用Format
:
//Get size of window.
CRect rcWindow
GetWindowRect (rcWindow)
//Format message
.
CString strMessage
strMessage.Format (_T ("Window Size (%d, %d)"),
rcWindow.Width
, rcWindow.Height
)
//Display the message.
MessageBox (strmessage)
(60)串太长时如何在其末尾显示
个省略号
CDC:: DrawText并指定DT_END_ELLIPSIS标志
这样就可以用小略号取代串末尾
使其适合于指定
边界矩形
如果要显示路径信息
指定DT_END_ELLIPSIS标志并省略号取代串中间
void CSampleView:: _disibledevent=>ASSERT_VALID (pDoc)
//Add ellpsis to end of
it does not fit
pDC->Drawtext (CString ("This is a long
"), CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS)
//Add ellpsis to middle of
it does not fit
pDC->DrawText (AfxgetApp
->m_pszhelpfilePath, CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS)
}
(61)为什么即使
EnableMenuItem菜单项后
菜单项还处于禁止状态
需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE
如果该数据成员为TRUE(缺省值)
工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND
菜单项
//Disable MFC from automatically disabling menu items.
m_bAuoMenuEnable=FALSE
//Now enable the menu item.
CMenu* pMenu=GetMenu
ASSERT_VALID (pMenu)
pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED)
(62)如何给系统菜单添加
个菜单项
给系统菜单添加
个菜单项需要进行下述 3个步骤:
首先
使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID
该ID应大于0x0F而小于0xF000;
其次
CWnd::Get
Menu获取系统菜单
指针并
CWnd:: Appendmenu将菜单项添加到菜单中
下例给系统菜单添加两个新
CMainFrame:: _disibledevent=>ASSERT (IDM-MYSYSITEM<0xF000)
//Get po
er to system menu.
CMenu* pSysmenu=Get
menu (FALSE)
ASSERT_VALID (pSysMenu)
//Add a separator and our menu item to system menu.
CString StrMenuItem (_T ("New menu item"))
pSysMenu->Appendmenu (MF_SEPARATOR)
pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem)
…
}
现在
选择系统菜单项时用户应进行检测
使用ClassWizard处理WM_SYSCOMMAND消息并检测用户菜单
nID参数:
void CMainFrame:: _disibledevent=>{
//TODO-process system menu item
}
CMDIFrameWnd ::OnSysCommand (nID, lParam)
}
最后
个设计良好
UI应用
应当在系统菜单项加亮时在状态条显示
个帮助信息
这可以通过增加
个包含系统菜单基ID
串表
入口来实现
(63)如何确定顶层菜单所占据
菜单行数
这可以通过简单
减法和除法来实现
首先
用户需要计算主框窗口
高度和客户区;其次
从主框窗口
高度中减去客户区、框边界以及标题
高度;最后
除以菜单栏
高度
下例成员
是
个计算主框菜单所占据
行数
代码实现
CMainFrame:: GetMenuRows
{
CRect rcFrame,rcClient
GetWindowRect (rcFrame)
GetClientRect (rcClient)
(rcFrame.Height
-rcClient.Height
- :: Get
Metrics(SM_CYCAPTION) - (:: get
Metrics(SM_CYFRAME) *2)) / :: Get
Metrics(SM_CYMENU)
}
(64)在用户环境中如何确定系统显示元素
颜色
SDK
GetSysColor可以获取
个特定显示元素
颜色
下例介绍说明了如何在MFC
CMainFrameWnd:: _disibledevent=>
//Walk window list.
while (pWnd)
{
// I window visible, has a caption, and does not have an owner?
(pWnd ->IsWindowVisible
&& pWnd ->GetWindowTextLength
&&! pWnd ->GetOwner
)
{
//Add caption o window to list box.
pWnd ->GetWindowText (strCaption)
list.AddString (strCaption)
}
//Get next window in window list.
pWnd=pWnd ->GetWindow(GW_HWNDNEXT)
}
}
(69)如何确定Windows和Windows系统目录
有两个SDK
可以完成该功能
GetWindowsDirectory和Get
Directory
下例介绍说明了如何使用这两个
:
TCHAR szDir [MAX_PATH]
//Get the full path of the windows directory.
∶ : GetWindowsDirectory (szDir, MAX_PATH)
TRACE ("Windows directory %s"n", szDir)
//Get the full path of the windows system directory.
∶ : Get
Directory (szDir, MAX_PATH)
TRACE ("Windows system directory %s"n", szDir)
(70)在哪儿创建临文件
SDK
GetTemPath可以确定临时文件
目录
该
首先为临时路径检测TMP环境变量:如果没有指定TMP
检测TMP环境变量
然后返回到当前目录
下例介绍说明了如何创建
个临时文件
…
//get unique temporary file.
CString strFile
GetUniqueTempName (strFile)
TRY
{
//Create file and write data.Note that file is closed
//in the destructor of the CFile object.
CFile file (strFile,CFile ::modeCreate | CFile:: modeWrite)
//write data
}
CATCH (CFileException, e)
{
//error opening file
}
END_CATCH
…
Void GetuniqueTempName (CString& strTempName)
{
//Get the temporary files directory.
TCHAR szTempPath [MAX_PATH]
DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath)
ASSERT (dwResult)
//Create a unique temporary file.
TCHAR szTempFile [MAX_PATH]
UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempfile)
ASSERT (nResult)
strTempName=szTempFile
}
(71)我怎样才能建立
个等待光标?
BeginWaitCursor
来启动等待光标
EndWaitCursor
来结束等待光标
要注意
2者都要
app
成员
如下所示:
AfxGetApp
->BeginWaitCursor
;
// 要做
事
AfxGetApp
->EndWaitCursor
;
(72)我在MDI框架中有个 form 视窗
它有个取消按钮
我需要当用户按取消按钮时可关闭form视窗
我应该如何关闭该文档?
_disibledevent=>HWND hWnd= :: GetWindow (:: GetDesktopWindow
, GW_CHILD)
while (hWnd!=NULL)
{
(:: IsWindowEnabled (hwnd)
&& CWnd::FromHandlePermanent (hWnd)!=NULL
&& AfxIsDescendant (pParent->m_hWnd, hWnd)
&& :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0)
0)
{
nCount
}
hWnd=:: GetWindow (hWnd, GW_HWNDNEXT)
}
…
(74)什么是COLORREF? 我该怎样用它?
COLORREF 是
个 32-bit 整型数值
它代表了
种颜色
你可以使用 RGB
来
化 COLORREF
例如:
COLORREF color = RGB(0, 255, 0);
RGB
接收 3个 0-255 数值
个代表红色
个代表绿色
个代表蓝色
在上面
例子中
红色和蓝色值都为 0
所以在该颜色中没有红色和蓝色
绿色为最大值 255
所以该颜色为绿色
0,0,0 为黑色
255,255,255 为白色
另
种
化 COLORREF
思路方法如下所示:
CColorDialog colorDialog;
COLORREF color;
( colorDialog.DoModal
IDOK )
{
color = colorDialog.GetColor
;
}
这段代码使用了 MFC 中
颜色对话框
它需要文件
(75)AppWizard所产生
STDAFX文件是干什么用
?
它主要是协助产生预编译头文件
通常你是不需要修改它
(76)我在我
中是了CDWordArray
我向它添加了约10,000个整数
这使得它变得非常非常慢
为什么会这么糟?
CDWordArray 是很好用
只是
你没有指定
最大尺寸
因此
当你添加新元素时
该类会从堆中重新分配空间
不幸
是
该类会在每次插入新元素时都为
重新分配空间
如果你向它添加了很多新元素
所有这些分配和复制
操作会就会使它变慢
解决该问题
思路方法是
你可以使用 SetSize
第 2个参数来改变这种重新分配
频率
例如
如果你把该参数设置为 500
则每次
空间超出时它才重新分配并添加 500 个新空间
而不是 1 个
这样
来
你就可以不用重新分配而添加了另外 499 个元素空间
这也会大大提高
运行速度
(77)我该如何改变MDI框架窗口
子窗口
大小以使在窗口以
定
大小打开?
在视中
_disibledevent=>app->MyGlobalVariable = ...
(80)我听说MFC可以发现内存漏洞
我怎样使用该特性?
如果你在 Debug 菜单中
Go 选项 ( 不是 Project 菜单中
Execute 选项 ) 来运行你
应用
MFC 应该在
终止时报告内存漏洞
如果没有
那么试试运行 MFC Tracer 工具
( 在 VC
组中 )
并启动跟踪
然后返回应用
(81)我怎样才能在我
应用
中循环浏览已经打开
文档?
使用CDocTemplate中未公开
GetFirstDocPosition
和GetNextDoc
(82)才能在我
应用
中循环浏览已经打开
视?
使用 CDocument 中未公开
GetFirstViewPosition
和 GetNextView
(83)数PreCreateWindow是干什么用
?
PreCreateWindow 允许你在
CreateWindow 的前来改变窗口属性
(84)该怎样防止MFC在窗口标题栏上把文档名预置成应用
名?
在 PreCreateWindow
中删除 FWS_PREFIXTITLE 标志
窗口样式:
cs.style &= ~FWS_PREFIXTITLE;
(85)我应该怎样防止MFC在窗口标题栏上添加文档名?
在 PreCreateWindow
中删除 FWS_ADDTOTITLE 标志
窗口样式:
cs.style &= ~FWS_ADDTOTITLE ;
(86)我应该如何改变视窗口
大小?
视窗口实际上是框架窗口
子窗口
所以你必须改变框架窗口
大小
而不是改变视窗口
使用 CView 类中
GetParentFrame
获得指向框架窗口
指针
然后
MoveWindow
来改变框架
大小
这会使变尺寸
视充满框架窗口
(87)我有
无模式对话框
我怎样才能在窗口退出时删除CDialog对象?
把“delete this”加到 PostNcDestroy 中
这主要用在需要自动删除对象
场合
(88)为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?
OnNcDestroy 只被已建立
窗口
如果建立窗口失败 ( 如 PreCreateWindow )
则没有窗口处来发送 WM_NCDESTROY 消息
PostNcDestroy 是在对象窗口被完全删除
在 _disibledevent=>sysmenu->AppendMenu(MF_STRING, 1000, "xxx");
参见 MFC 帮助文件中
CMenu 类
(92)我建立了
个对话框
但是当我显示该对话框时
第
个编辑框总是不能获得焦点
我必须单击它来使它获得焦点
我怎样才能使第
个编辑框在对话框打开时就获得焦点?
打开资源编辑器中
对话框模板
在 Layout 菜单中选择 Tab Order 选项
按你
需求单击对话框中
控制来重新排列这些控制
tab 顺序
(93)我怎样才能使
个窗口具有“always _disibledevent=>如果 ZipCode 列被定义为
串时不会出现问题
如果定义为 long
则会出现“Internal Application Error”对话框
这是由于类型不匹配
缘故
如果你删除 27111
单引号
则不会出现问题
当你看到“Internal Application Error”时
最好检查
下试图要发送给数据库
SQL 语句
(97) 我用ClassWizard建立了
个类
但是
我把名字取错了
我想把它从项目中删除
应该如何做?
在 ClassWizard 对话框关闭后
用文件管理器删除新类
H 和 CPP 文件
然后打开 ClassWizard
它会提示丢失了两个文件
并询问你该如何做
你可以选择从项目中删除这两个问
按钮
(98) 当我打开应用
中
窗口时
我要传递该窗口
矩形尺寸
该矩形指定了窗口
外围大小
但是当我
GetClientRect时
所得到
尺寸要比所希望
值要小(
工具栏和窗口边框
缘故)
有其它思路方法来计算窗口
尺寸吗?
参见 CWnd::CalcWindowRect
(99) 我在文档类中设置了
个整型变量
但是
当我试图把该变量写入Serialize
中
archive文件中时
出现了类型
而文档中
其它变量没有问题
为什么?
archive 类只重载某些类型
>> 和 << 操作符
“
”类型没有在其中
也许是
变量在 Windows 3.1 和 Windows NT/95 有所区别
缘故吧
“long”类型得到了支持
所以你可以把
类型改成 long 型
参见 MFC 帮助文件中 CArchive 类
(100) 如何控制菜单
大小?
我用MFC
CMenu生成了
个动态菜单(例如File,Edit,View...Help), 我想控制这个菜单
大小(长+高).
思路方法
:查找 WM_MEASUREITEM 和 MEASUREITEMSTRUCT.
思路方法 2:查询系统::Get
Metric(SM_CXMENUSIZE).
/* 你可以通过如下代码来获得文本
大小:
(A)获得被使用
字体 */
NONCLIENTMETRICS ncm;
HFONT hFontMenu;
SIZE size;
size.cy = size.cy = 0;
mem
(&ncm, 0,
(NONCLIENTMETRICS));
ncm.cbSize =
(NONCLIENTMETRICS);
(
ParametersInfo(SPI_GETNONCLIENTMETRICS,
(NONCLIENTMETRICS), &ncm, 0))
{
hFontMenu = CreateFontIndirect(&ncm.lfMenuFont);
/*
(B) 获得菜单项
文本: */
char szText[_MAX_PATH];
pMenu->GetMenuString(0, szText, _MAX_PATH, MF_BYPOSITION);
/*
然后,获得菜单项文本
高度: */
HFONT hFontOld;
HDC hDC;
hDC = ::GetDC(NULL);
hFontOld = (HFONT) ::SelectObject(hDC, hFontMenu);
GetTextExtentPo
32(hDC, szText, lstrlen(szText), &size);
SelectObject(hDC, hFontOld);
::ReleaseDC(NULL, hDC);
}
/*此时,size.cy即为高度,size.cx为宽度,你可以给菜单加上自定义
高度和宽度,通过比较,我发现宽度为4
比较合适
*/
(101) 改变LVIS_SELECTED
状态颜色?
我想将CListCtrl项和CTreeCtrl项在LVIS_SELECTED状态时
颜色变灰.
思路方法
:查找
CustomDraw,它是IE4提供
公共控制,允许有你自己
代码.
思路方法 2:生成
个drawControl控件,然后在DrawItem中处理文本颜色.
(102) 如何只存储文档
某
部分?
我只想存储文档
某
部分,能否象使用文件
样使用文档?(也就是有定位
).将每个CArchive类设置为CFile类
派生类,这样你就能使用Seek等成员
.
(103) 保存工具条菜单有bug吗?
使用浮动菜单条时,SaveBarState和LoadBarState出现了问题.如果菜单是浮动
,重起应用
时它会出现在左上角,而它固定在屏幕其它位置时,下
次启动就会出现在该位置,这是什么原因?你试试这个PToolBar->Create(this,...,ID_MYTOOLBAR);
你
工具条需要包括id,而不是象默认
工具条那样.
(104) Tip of the day
bug
我创建了
个简单
mdi应用
,使用.BSF(自定义
文档扩展名)作为它
文档我保存
个foo.bsf文档后,可以在资源管理器中双击该文件打开mdi应用
同时打开foo.bsf文档.但当我给mdi应用
加上a tip of the day组件的后,从资源管理器中双击foo.bsf后,就会给我
个警告:ASSERT(::IsWindow(m_hWnd)),然后mdi应用
就死那了.
当从dde启动应用
(例如:双击相关文档)时,"Tip of the Day"是有bug
.你可以看看
"ShowTipAtStartup",它在"InitInstance"中
,可以看到tip of the day作为
个模式对话框显示,在处理其它消息时它
直进行消息循环你可心修改ShowTipAtStartup使其从dde启动时不出现tip of the day.
void CTipOfApp::ShowTipAtStartup(void)
{
// CG: This function added by 'Tip of the Day' component.
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
(
cmdInfo.m_bShowSplash &&
cmdInfo.m_nShellCommand != CCommandLineInf:FileDDE
)
{
CTipDlg dlg;
(dlg.m_bStartup)
dlg.DoModal
;
}
}
如果还有其它bug,你可以设定cmdInfo.m_nShellCommand
过滤.
(105) 如何可以让我
可以显示在其它
窗口上面?
让用户选择"总是在最上面"最好是在系统菜单里加入
个选项.可以通过修改WM_SYSCOMMAND消息来发送用户
选择.菜单
命令标识(id)会作为
个参数传给OnSysCommand
.要定义标识(id),将如下代码加入到CMainFrame.CPP中:
#
WM_ALWAYSONTOP WM_USER + 1
将"总在最上面"
菜单项加入到系统菜单中,将如下代码加入到
CMainFrame::OnCreate
中:
CMenu* pSysMenu = Get
Menu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, WM_ALWAYSONTOP,
"&Always _disibledevent=>
nHeightOff
= rectWindow.Height
- rectClient.Height
;
lpMMI->ptMinTrackSize.x = MINX + nWidthOff
;
lpMMI->ptMinTrackSize.y = MINY + nHeightOff
;
lpMMI->ptMaxTrackSize.x = MAXX + nWidthOff
;
lpMMI->ptMaxTrackSize.y = MAXY + nHeightOff
;
}
第 2步,在CFrameWnd
继承类
PreCreateWindow
中去掉WS_MAXIMIZEBOX消息,否则在最大化时你将得不到预料
结果.
BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~WS_MAXIMIZEBOX;
CFrameWnd::PreCreateWindow(cs);
}
(107) 如何改变窗口框架
颜色?
MDI框架
客户区被另
个窗口
框架所覆盖.为了改变客户区
背景色,你需要重画这个客户窗口.为了做到这点,你要处理消息WM_ERASEBKND产生
个新类,从CWnd继承,姑且称的为CMDIClient.给它加上
个成员变量,
#
"MDIClient.h"
CMainFrame : public CMDIFrameWnd
{
...
protected:
CMDIClient m_wndMDIClient;
}
在CMainFrame中重载CMDIFrameWnd::OnCreateClient
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )
{
m_wndMDIClient.Sub
Window(m_hWndMDIClient);
TRUE;
}
FALSE;
}
然后就可以加入对消息WM_ERASEBKGND
处理了.
(108) 如何将应用
窗口置于屏幕正中?
要将你
应用
窗口放置在屏幕正中央,只须在MainFrame
OnCreate
中加入:
CenterWindow( GetDesktopWindow
);
(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)
{
( :: SHGetFileInfo(_T("c:""pwin95""notepad.exe"),0,
&stFileInfo,
(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon)
}
}
Example(2):同样功能,Use ExtractIcon Function
void CSampleView:: _disibledevent=>("NotePad.exe"),0)
(hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon)
}
介绍说明: 获得notepad.exe
路径正规上来说用GetWindowsDirectory
得到, 如果是
win95下
画笔
应该用访问注册表
思路方法获得其路径
要作成
个比较考究
考虑应该全面点.
(4)获得各种目录信息
Windows目录: Use "GetWindowsDirectory"
Windows下
system目录: Use "Get
Directory"
temp目录: Use "GetTempPath"
当前目录: Use "GetCurrentDirectory"
请注意前两个
第
个参数为目录变量名
后
个为缓冲区后两个相反.
(5)如何自定义消息
1) 手工定义消息
可以这么写
#
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=Get
Metrics(SM_CXSCREEN/2)
cs.cy=Get
Metrics(SM_CYSCREEN/2)
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派生,
_disibledevent=>
// Now spec
y the
window style .
cs.style &= ~ (ES_AUTOHSCROLL |WS_HSCROLL)
bResult
}
(13)如何使
保持极小状态?
这么办: 在恢复
窗体大小时
Windows会发送WM_QUERY-OPEN消息
用 ClassWizard设置成员
OnQueryOpen
,add following code:
Bool CMainFrame:: _disibledevent=>
(nHitTest = =HTCLIENT)? HTCAPTION : nHitTest
}
上述技术有两点不利的处
其
是在窗口
客户区域双击时
窗口将极大;
其 2
它不适合包含几个视窗
主框窗口
还有
种思路方法
当用户按下鼠标左键使主框窗口认为鼠标在其窗口标题上
使用ClassWizard在视窗中处理WM_LBUTTODOWN信息并向主框窗口发送
个WM_NCLBUTTONDOWN信息和
个单击测试HTCAPTION
void CSampleView : : _disibledevent=>
// Get the area that needs to be erased .
CRect reClip
pDC—>GetCilpBox (&rcClip)
//Pa
the area.
pDC—> PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY )
//Unselect brush out of device context .
pDC—>SelectObject (pOldBrush )
// Return nonzero to half fruther processing .
TRUE
}
(19)如何改变窗口标题
CWnd : : SetWindowText可以改变任何窗口(包括Control控件)
标题
//Set title for application's
frame window .
AfxGetMainWnd ( ) —> SetWindowText (_T("Application title") )
//Set title for View's MDI child frame window .
GetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame
title")
)
//Set title for dialog's push button control.
GetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button
title ") )
如果需要经常修改窗口
标题(注:Control控件也是窗口)
应该考虑使用半文档化
AfxSetWindowText
该
在AFXPRIV.H中介绍说明
在WINUTIL.CPP中实现
在联机帮助中找不到它
它在AFXPRIV.H中半文档化
在以后发行
MFC中将文档化
AfxSetWindowText
实现如下:
voik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew )
{
itn nNewLen= Istrlen (Ipaz
)
TCHAR szOld [256]
//fast check to see
text really changes (reduces
flash in the
controls )
(nNewLen >_contof (szOld)
|| : : GetWindowText (hWndCrtl, szOld , _countof (szOld) !=nNewLen
|| Istrcmp (szOld , IpszNew)! = 0
{
//change it
: : SetWindowText(hWndCtrl , IpszNew )
}
}
(20)如何防止主框窗口在其介绍说明中显示活动
文档名
创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位
如果不希望在介绍说明中自动添加文档名
必须禁止该风格位
可以使用ClassWizard重置
CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格
BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)
{
//Turn off FWS_ADDTOTITLE in
frame .
cs.styel & = ~FWS_ADDTOTITLE
CMDIFrameWnd : : PreCreateWindow (cs )
}
关闭MDI子窗口
FWS _ADDTOTITLE风格将创建
个具有空标题
窗口
可以
CWnd: : SetWindowText来设置标题
记住自己设置标题时要遵循接口风格指南
(21)如何获取有关窗口正在处理
当前消息
信息
CWnd: : GetCurrentMessage可以获取
个MSG指针
例如
可以使用ClassWizard将几个菜单项处理
映射到
个
中
然后
GetCurrentMessage来确定所选中
菜单项
viod CMainFrame : : _disibledevent=>—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)
//Get po
er to toolbar .
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_TOOLBAR)
(23)如何使能和禁止工具条
工具提示
如果设置了CBRS_TOOLTIPS风格位
工具条将显示工具提示
要使能或者禁止工具提示
需要设置或者清除该风格位
下例通过
CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立
个完成此功能
成员
:
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )
{
ASSERT_VALID (m_wndToolBar)
DWORD dwStyle = m _wndToolBar.GetBarStyle ( )
(bDisplayTips) dwStyle |=CBRS_TOOLTIPS
dwStyle & = ~CBRS_TOOLTIPS
m_wndToolBar.SetBarStyle (dwStyle )
}
(24)如何创建
个不规则形状
窗口
可以使用新
SDK
SetWindowRgn
该
将绘画和鼠标消息限定在窗口
个指定
区域
实际上使窗口成为指定
不规则形状
使用AppWizard创建
个基于对
应用
并使用资源编辑器从主对话资源中删除所在
缺省Control控件、标题以及边界
给对话类增加
个CRgn数据成员
以后要使用该数据成员建立窗口区域
Class CRoundDlg : public CDialog
{
…
private :
Crgn m_rgn : // window region
…
}
修改OnInitDialog
建立
个椭圆区域并
SetWindowRgn将该区域分配给窗口:
BOOL CRoundDlg : : _disibledevent=>BYTE byRed =GetRValue (color)
BYTE byGreen = GetGValue (color)
BYTE byBlue = GetBValue (color)
// get the size of the view window
Crect rect
GetClientRect (rect)
// get minimun number of units
nUnits =min (rect.right , rect.bottom )
//calculate he horiaontal and vertical step size
float fltStepHorz = (float) rect.right /nUnits
float fltStepVert = (float) rect.bottom /nUnits
nEllipse = nUnits/3 // calculate how many to
draw
nIndex
// current ellipse that is being draw
CBrush brush
// bursh used for ellipse fill color
CBrush *pBrushOld // previous
brush that was selected
o dc
//draw ellipse , gradually moving towards upper-right
corner
for (nIndex = 0 nIndes < + nEllipse nIndes
)
{
//creat solid brush
brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ).
( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)
/nEllipse ) ) )
//select brush
o dc
pBrushOld= dc .SelectObject (&brhsh)
//draw ellipse
dc .Ellipse ( (
) fltStepHorz * 2, (
) fltStepVert * nIndex ,
rect. right -( (
) fltStepHorz * nIndex )+ 1,
rect . bottom -( (
) fltStepVert * (nIndex *2) ) +1)
//delete the brush
brush.DelecteObject ( )
}
}
最后
处理WM_NCHITTEST消息
使当击打窗口
任何位置时能移动窗口
UINT CRoundDlg : : _disibledevent=>rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest
}
(25)如何获取应用
例子句柄?
应用
例子句柄保存在CWinApp m_hInstance 中,可以这么
AfxGetInstancdHandle获得句柄.
Example: HANDLE hInstance=AfxGetInstanceHandle
(26)如何编程结束应用
?
这是个很简单又是编程中经常要遇到
问题.
向窗口发送 WM_CLOSE消息,
CWnd::OnClose成员
.允许对用户提示是否保存修改过
数据.
Example: AfxGetMainWindow
->SendMessage(WM_CLOSE)
还可以创建
个自定义
Terminate Window
void Terminate Window(LPCSTR pCaption)
{
CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption)
(pWnd)
pWnd ->SendMessage(WM_CLOSE)
}
介绍说明: FindWindow
不是提倡
做法
它无法处理标题栏自动改变
比如我们要检测 Notepad是不是已运行而事先不知道Notepad
标题栏,这时FindWindow就无能为力了
可以通过枚举 windows任务列表
办法来实现
在机械出版社"Windows 95 API开发人员指南"
书有比较详细
介绍,这里就不再多说乐
(27)如何创建和使用无模式对话框
MFC将模式和无模式对话封装在同
个类中
但是使用无模式对话需要几个对话需要几个额处
步骤
首先
使用资源编辑器建立对话资源并使用ClassWizard创建
个CDialog
派生类
模式和无模式对话
中止是不
样
:模式对话通过
CDialog : : EndDialog 来中止
无模式对话则是
CWnd: : DestroyWindow来中止
CDialog : : _disibledevent=>ASSERT_VALID (pDialog) Destroy ( )
//Create the modeless dialog . represents this dialog.
BOOL bResult = pDialog —> Creste (IDD_IDALOG)
ASSERT (bResult )
}
(28)如何防止主框窗口在其介绍说明中显示活动
文档名
创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位
如果不希望在介绍说明中自动添加文档名
必须禁止该风格位
可以使用ClassWizard重置
CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格
BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)
{
//Turn off FWS_ADDTOTITLE in
frame .
cs.styel & = ~FWS_ADDTOTITLE
CMDIFrameWnd : : PreCreateWindow (cs )
}
关闭MDI子窗口
FWS _ADDTOTITLE风格将创建
个具有空标题
窗口
可以
CWnd: : SetWindowText来设置标题
记住自己设置标题时要遵循接口风格指南
(29)如何在代码中获取工具条和状态条
指针
缺省时
工作框创建状态条和工具条时将它们作为主框窗口
子窗口
状态条有
个AFX_IDW_STATUS_BAR标识符
工具条有
个AFX_IDW_TOOLBAR标识符
下例介绍说明了如何通过
起
CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口
指针:
//Get po
er to status bar .
CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)
//Get po
er to toolbar .
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_TOOLBAR)
(30)怎样加载其他
应用
?
3个SDK
winexec, shellexecute,createprocess可以使用
WinExec最简单
两个参数
前
个指定路径
后
个指定显示方式.后
个参数值得说
下
比如泥用 SW_SHOWMAXMIZED方式去加载
个无最大化按钮
就是Neterm,calc等等
就不会出现正常
窗体
但是已经被加到任务列表里了
ShellExecute较 WinExex灵活
点
可以指定工作目录,下面
Example就是直接打开 c:"temp"1.txt,而不用加载和 txt文件关联
应用
,很多安装
完成后都会打开
个窗口
来显示Readme or Faq,我猜就是这么作
啦.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:""temp"),SW_SHOWMAXMIZED)
CreateProcess最复杂
共有十个参数
不过大部分都可以用NULL代替
它可以指定进程
安全属性
继承信息
类
优先级等等.来看个很简单
Example:
STARTUPINFO stinfo
//启动窗口
信息
PROCESSINFO procinfo //进程
信息
CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,
NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo,&procinfo)
(31)如何在代码中获取工具条和状态条
指针
缺省时
工作框创建状态条和工具条时将它们作为主框窗口
子窗口
状态条有
个AFX_IDW_STATUS_BAR标识符
工具条有
个AFX_IDW_TOOLBAR标识符
下例介绍说明了如何通过
起
CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口
指针:
//Get po
er to status bar .
CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)
(32)如何使能和禁止工具条
工具提示
如果设置了CBRS_TOOLTIPS风格位
工具条将显示工具提示
要使能或者禁止工具提示
需要设置或者清除该风格位
下例通过
CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立
个完成此功能
成员
:
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )
{
ASSERT_VALID (m_wndToolBar)
DWORD dwStyle = m _wndToolBar.GetBarStyle ( )
(bDisplayTips) dwStyle |=CBRS_TOOLTIPS
dwStyle & = ~CBRS_TOOLTIPS
m_wndToolBar.SetBarStyle (dwStyle )
}
//Get po
er to toolbar .
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )
—> GetDescendantWindow(AFX_IDW_TOOLBAR)
(33)如何设置工具条标题
工具条是
个窗口
所以可以在
CWnd : : SetWindowText来设置标题
例子如下:
CMainFrame : : _disibledevent=>
(HBRUSH) m_brush.GetSafeHandle ( )
CFormView : : _disibledevent=>
nReslt = DlgDirListComboBox (szPath, IDC_COMBO , IDC_CURIDIR, DDL_READWRITE |DDL_READONLY|DDL_HIDDEN| DDL_SYSTEM|DDL_ARCHIVE)
TRUE
}
(42)为什么旋转按钮Control控件看起来倒转
需要
CSpinCtrl : : SetRange 设置旋转按钮Control控件
范围
旋转按钮Control控件
缺省上限为0
缺省下限为100
这意味着增加时旋转按Control控件
值由100变为0
下例将旋转按钮Control控件
范围设置为0到100:
BOOL CAboutDlg : : _disibledevent=>ASSERT_VALID (m_pButton)
m_pButton —>Create (_T ("Button Title ") , WS_CHILD |WS_VISIBLE |BS_PUSHBUTTON. Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )
(47)如何限制编辑框中
准许
如果用户在编辑Control控件中只允许接收数字
可以使用
个标准
编辑Control控件并指定新
创建标志ES_NUMBERS,它是Windows 95新增加
标志
该标志限制编辑Control控件只按收数字
如果用户需要复杂
编辑Control控件
可以使用Microsoft
屏蔽编辑Control控件
它是
个很有用
OLE定制Control控件
如果希望不使用OLE 定制Control控件自己处理
可以派生
个CEdit类并处理WM_CHAR消息
然后从编辑Control控件中过滤出特定
首先
使用ClassWizard建立
个 CEdit
派生类
其次
在对话类中指定
个成员变量将编辑Control控件分类在OnInitdialog 中
CWnd: : Sub
DlgItem .
//In your dialog
declaration (.H file )
private : CMyEdit m_wndEdit // Instance of your
edit control .
//In you dialog
implementation (.CPP file )
BOOL CSampleDialog : : _disibledevent=>
//Bypass default _disibledevent=>
//Draw red text for all edit controls .
(nCtlColor= = CTLCOLOR_EDIT )
pDC —> SetTextColor (RGB (255, 0 , 0 , ) )
hbr
}
然而
由于每个父窗口必须处理通知消息并指定每个Control控件
绘画属性
所以
这种思路方法不是完全
面向对象
思路方法
Control控件处理该消息并指定绘画属性更合情合理
消息反射允许用户这样做
通知消息首先发送给父窗口
如果父窗口没有处理则发送给Control控件
创建
个定制彩色列表框Control控件必须遵循下述步骤
首先
使用ClassWizard 创建
个CListBox
派生类并为该类添加下述数据成员
CMyListBox publilc CListBox
{
…
private
COLORREF m_clrFor // foreground color
COLORREF m_clrBack //background color
Cbrush m_brush //background brush
…
}
其次
在类
构造
中
化数据中
CMyListBox : : CMyListBox
{
//Initialize data members .
m_clrFore =RGB (255 , 255 , 0) //yellow text
m_clrBack=RGB (0 , 0 , 255) // blue background
m_brush . CreateSolidBrush (m _clrBack )
}
最后
使用ClassWizard处理反射
WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新
绘画属性
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )
{
pDC—>SetTextColor (m_clrFore)
pDC—>SetBkColor (m_clrBack)
(HBRUSH) m_brush.GetSafeHandle
}
现在
Control控件可以自己决定如何绘画
和父窗口无关
(49)当向列表框中添加多个项时如何防止闪烁
CWnd::SetRedraw 清除重画标志可以禁止CListBox(或者窗口)重画
当向列表框添加几个项时
用户可以清除重画标志
然后添加项
最后恢复重画标志
为确保重画列表框
新项
SetRedraw (TRUE) 的后
CWnd::Invalidate
//Disable redrawing.
pListBox->SetRedraw (FALSE)
//Fill in the list box gere
//Enable drwing and make sure list box is redrawn.
pListBox->SetRedraw (TRUE)
pListBox->Invalidate
(50)如何向编辑Control控件中添加文本
由于没有CEdit:: AppendText
用户只好自己做此项工作
CEdit:: SetSel移动到编辑Control控件末尾
然后
CEdit:: ReplaceSel添加文本
下例是AppendText
种实现思路方法:
void CMyEdit:: AppendText (LPCSTR pText)
{
nLen=GetWindowTextLength
SetFocus
SetSel (nLen, nLen)
ReplaceSel (pText)
}
(51)如何访问预定义
GDI对象
可以通过
CDC:: SlectStockObject使用Windows
几个预定义
对象
诸如刷子、笔以及字体
下例使用了Windows预定义
笔和刷子GDI对象在视窗中画
个椭圆
//Draw ellipse using stock black pen and gray brush.
void CSampleView:: _disibledevent=>
//Draw the ellipse.
pDC->Ellipse (rcView)
//Restore original brush.
pDC->SelectObject (pOrgBrush)
}
(52)如何获取GDI对象
属性信息
可以
GDIObject:: GetObject
这个
将指定图表设备
消息写入到缓冲区
下例创建了几个有用
辅助
//Determine
font is bold.
BOOL IsFontBold (const CFont&font)
{
LOGFONT stFont
font.GetObject (
(LOGFONT), &stFont)
(stFont.lfBold)? TRUE: FALSE
}
//Return the size of a bitmap.
CSize GetBitmapSize (const CBitmap&bitmap)
{
BITMAP stBitmap
bitmap.GetObject (
(BITMAP), &stBitmap)
CSize (stBitmap.bmWidth, stBitmap.bmHeight)
}
//Create a pen with the same color as a brush.
BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush)
{
LOGBRUSH stBrush
brush.Getobject (
(LOGBRUSH), &stBrush)
pen. Createpen (PS_SOLID, 0, stBrush.ibColor)
}
(53)如何实现
个橡皮区矩形
CRectTracker是
个很有用
类
可以通过
CRectTracker::TrackRubberBand 响应WM_LBUTTONDOWN消息来创建
个橡皮区矩形
下例表明使用CRectTracker移动和重置视窗中
蓝色椭圆
大小是很容易
事情
首先
在文件档中声明
个CRectTracker数据成员:
CSampleView : Public CView
{
…
public :
CrectTracker m_tracker
…
}
其次
在文档类
构造
中
化CRectTracker 对象:
CSampleDoc:: CSampleDOC
{
//Initialize tracker position, size and style.
m_tracker.m_rect.SetRect (0, 0, 10, 10)
m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker ::dottedLine
}
然后
在OnDraw
中画椭圆和踪迹矩形:
void CSampleView:: _disibledevent=>ASSERT_VALID (pDoc)
//Select blue brush
o device context.
CBrush brush (RGB (0, 0, 255))
CBrush* pOldBrush=pDC->SelectObject (&brush)
//draw ellipse in tracking rectangle.
Crect rcEllipse
pDoc->m_tracker.GetTrueRect (rcEllipse)
pDC->Ellipse (rcEllipse)
//Draw tracking rectangle.
pDoc->m_tracker.Draw (pDC)
//Select blue brush out of device context.
pDC->Selectobject (pOldBrush)
}
最后
使用ClassWizard处理WM_LBUTTONDOWN消息
并增加下述代码
该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆
大小
void CSampleView::OnLButtonDown (UINT nFlags, CPo
po
)
{
//Get po
er to document.
CSampleDoc* pDoc=GetDocument
ASSERT_VALID (pDoc)
//If clicked _disibledevent=>
//Tracker rectangle changed so update views.
(bResult)
{
pDoc->m_tracker.Track (this,po
,TRue)
pDoc->SetMod
iedFlag
pDoc->UpdateAllViews (NULL)
}
pDoc->m-tracker.TrackRubberBand(this,po
,TRUE)
CView:: _disibledevent=>下例创建了
个8点
Apial字体:
…
CClientDC dc (AqfxGetMainWnd
)
m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, DRAFT_QUALITY, VARIABLE_PITCH | FF-SWISS,_T("Arial"))
(56)如何计算
个串
大小
CDC:: Det text Extent 根据当前选择
字体计算
个串
高度和宽度
如果使用
不是系统字体而是其他字体
则在
GetTextExtent的前将字体选进设备上下文中是很重要
否则计算高度和宽度时将依据系统字体
由此得出
结果当然是不正确
下述样板
当改变下压按钮
标题时动态调整按钮
大小
按钮
大小由按钮
字体和标题
大小而定
响应消息WM_SETTEXT时
OnSetText
该消息使用ON_MESSAE宏指令定义
用户自定义消息
LRESULT CMyButton:: _disibledevent=>//Get title of push button.
CString strTitle
GetWindowText (strTitle)
//Select current font
o device context.
CDC* pDC=GetDc
CFont*pFont=GetFont
CFont*pOldFont=pDC->SelectObject (pFont)
//Calculate size of title.
CSize size=pDC->GetTextExent (strTitle,strTitle.GetLength
)
//Adjust the button's size based _disibledevent=>stFont.
Weight=FW_NORMAL
stFont.
ClipPrecision=LCIP_LH_ANGLES
strcpy (stFont.lfFaceName, "Arial")
//Draw text at 15degree
ervals.
for (
nAngle=0 nAngle<3600 nAngle
150)
{
//Spec
y
angle.
stFont.lfEscapement=nAngle
//Create and select font
o dc.
font.CreateFontIndirect(&stfont)
CFont* pOldFont=pDC ->SelectObject(&font)
//Draw the text.
pDC->SelectObject(pOldFont)
font.DelectObjext
}
}
(58)如何正确显示包含标签
串
GDI文本绘画
时需要展开标签
这可以通过
CDC:: TabbedTextOut或者CDC:: DrawText并指定DT_EXPANDTABS标志来完成
TabbedTextOut
允许指定标签位
下例指定每20设备单位展开
个标签:
void CSampleView:: _disibledevent=>ASSERT_VALID (pDoC)
CString str
str.Format (_T ("Cathy"tNorman"tOliver"))
nTabStop=20 //tabs are every 20 pixels
pDC->TabbedtextOut (10, 10, str, 1, &nTabStop, 10)
}
(59)如何快速地格式化
个CString对象
CString:: Format
该
和pr
f
具有相同
参数
下例介绍说明了如何使用Format
:
//Get size of window.
CRect rcWindow
GetWindowRect (rcWindow)
//Format message
.
CString strMessage
strMessage.Format (_T ("Window Size (%d, %d)"),
rcWindow.Width
, rcWindow.Height
)
//Display the message.
MessageBox (strmessage)
(60)串太长时如何在其末尾显示
个省略号
CDC:: DrawText并指定DT_END_ELLIPSIS标志
这样就可以用小略号取代串末尾
使其适合于指定
边界矩形
如果要显示路径信息
指定DT_END_ELLIPSIS标志并省略号取代串中间
void CSampleView:: _disibledevent=>ASSERT_VALID (pDoc)
//Add ellpsis to end of
it does not fit
pDC->Drawtext (CString ("This is a long
"), CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS)
//Add ellpsis to middle of
it does not fit
pDC->DrawText (AfxgetApp
->m_pszhelpfilePath, CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS)
}
(61)为什么即使
EnableMenuItem菜单项后
菜单项还处于禁止状态
需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE
如果该数据成员为TRUE(缺省值)
工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND
菜单项
//Disable MFC from automatically disabling menu items.
m_bAuoMenuEnable=FALSE
//Now enable the menu item.
CMenu* pMenu=GetMenu
ASSERT_VALID (pMenu)
pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED)
(62)如何给系统菜单添加
个菜单项
给系统菜单添加
个菜单项需要进行下述 3个步骤:
首先
使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID
该ID应大于0x0F而小于0xF000;
其次
CWnd::Get
Menu获取系统菜单
指针并
CWnd:: Appendmenu将菜单项添加到菜单中
下例给系统菜单添加两个新
CMainFrame:: _disibledevent=>ASSERT (IDM-MYSYSITEM<0xF000)
//Get po
er to system menu.
CMenu* pSysmenu=Get
menu (FALSE)
ASSERT_VALID (pSysMenu)
//Add a separator and our menu item to system menu.
CString StrMenuItem (_T ("New menu item"))
pSysMenu->Appendmenu (MF_SEPARATOR)
pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem)
…
}
现在
选择系统菜单项时用户应进行检测
使用ClassWizard处理WM_SYSCOMMAND消息并检测用户菜单
nID参数:
void CMainFrame:: _disibledevent=>{
//TODO-process system menu item
}
CMDIFrameWnd ::OnSysCommand (nID, lParam)
}
最后
个设计良好
UI应用
应当在系统菜单项加亮时在状态条显示
个帮助信息
这可以通过增加
个包含系统菜单基ID
串表
入口来实现
(63)如何确定顶层菜单所占据
菜单行数
这可以通过简单
减法和除法来实现
首先
用户需要计算主框窗口
高度和客户区;其次
从主框窗口
高度中减去客户区、框边界以及标题
高度;最后
除以菜单栏
高度
下例成员
是
个计算主框菜单所占据
行数
代码实现
CMainFrame:: GetMenuRows
{
CRect rcFrame,rcClient
GetWindowRect (rcFrame)
GetClientRect (rcClient)
(rcFrame.Height
-rcClient.Height
- :: Get
Metrics(SM_CYCAPTION) - (:: get
Metrics(SM_CYFRAME) *2)) / :: Get
Metrics(SM_CYMENU)
}
(64)在用户环境中如何确定系统显示元素
颜色
SDK
GetSysColor可以获取
个特定显示元素
颜色
下例介绍说明了如何在MFC
CMainFrameWnd:: _disibledevent=>
//Walk window list.
while (pWnd)
{
// I window visible, has a caption, and does not have an owner?
(pWnd ->IsWindowVisible
&& pWnd ->GetWindowTextLength
&&! pWnd ->GetOwner
)
{
//Add caption o window to list box.
pWnd ->GetWindowText (strCaption)
list.AddString (strCaption)
}
//Get next window in window list.
pWnd=pWnd ->GetWindow(GW_HWNDNEXT)
}
}
(69)如何确定Windows和Windows系统目录
有两个SDK
可以完成该功能
GetWindowsDirectory和Get
Directory
下例介绍说明了如何使用这两个
:
TCHAR szDir [MAX_PATH]
//Get the full path of the windows directory.
∶ : GetWindowsDirectory (szDir, MAX_PATH)
TRACE ("Windows directory %s"n", szDir)
//Get the full path of the windows system directory.
∶ : Get
Directory (szDir, MAX_PATH)
TRACE ("Windows system directory %s"n", szDir)
(70)在哪儿创建临文件
SDK
GetTemPath可以确定临时文件
目录
该
首先为临时路径检测TMP环境变量:如果没有指定TMP
检测TMP环境变量
然后返回到当前目录
下例介绍说明了如何创建
个临时文件
…
//get unique temporary file.
CString strFile
GetUniqueTempName (strFile)
TRY
{
//Create file and write data.Note that file is closed
//in the destructor of the CFile object.
CFile file (strFile,CFile ::modeCreate | CFile:: modeWrite)
//write data
}
CATCH (CFileException, e)
{
//error opening file
}
END_CATCH
…
Void GetuniqueTempName (CString& strTempName)
{
//Get the temporary files directory.
TCHAR szTempPath [MAX_PATH]
DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath)
ASSERT (dwResult)
//Create a unique temporary file.
TCHAR szTempFile [MAX_PATH]
UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempfile)
ASSERT (nResult)
strTempName=szTempFile
}
(71)我怎样才能建立
个等待光标?
BeginWaitCursor
来启动等待光标
EndWaitCursor
来结束等待光标
要注意
2者都要
app
成员
如下所示:
AfxGetApp
->BeginWaitCursor
;
// 要做
事
AfxGetApp
->EndWaitCursor
;
(72)我在MDI框架中有个 form 视窗
它有个取消按钮
我需要当用户按取消按钮时可关闭form视窗
我应该如何关闭该文档?
_disibledevent=>HWND hWnd= :: GetWindow (:: GetDesktopWindow
, GW_CHILD)
while (hWnd!=NULL)
{
(:: IsWindowEnabled (hwnd)
&& CWnd::FromHandlePermanent (hWnd)!=NULL
&& AfxIsDescendant (pParent->m_hWnd, hWnd)
&& :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0)
0)
{
nCount
}
hWnd=:: GetWindow (hWnd, GW_HWNDNEXT)
}
…
(74)什么是COLORREF? 我该怎样用它?
COLORREF是
个32-bit整型数值
它代表了
种颜色
你可以使用RGB
来
化COLORREF
例如:
COLORREF color = RGB(0, 255, 0);
RGB
接收 3个0-255数值
个代表红色
个代表绿色
个代表蓝色
在上面
例子中
红色和蓝色值都为0
所以在该颜色中没有红色和蓝色
绿色为最大值255
所以该颜色为绿色
0,0,0为黑色
255,255,255 为白色
另
种
化COLORREF
思路方法如下所示:
CColorDialog colorDialog;
COLORREF color;
( colorDialog.DoModal
IDOK )
{
color = colorDialog.GetColor
;
}
这段代码使用了MFC中
颜色对话框
它需要文件
(75)AppWizard所产生
STDAFX文件是干什么用
?
它主要是协助产生预编译头文件
通常你是不需要修改它
(76)我在我
中是了CDWordArray
我向它添加了约10,000个整数
这使得它变得非常非常慢
为什么会这么糟?
CDWordArray是很好用
只是
你没有指定
最大尺寸
因此
当你添加新元素时
该类会从堆中重新分配空间
不幸
是
该类会在每次插入新元素时都为
重新分配空间
如果你向它添加了很多新元素
所有这些分配和复制
操作会就会使它变慢
解决该问题
思路方法是
你可以使用SetSize
第 2个参数来改变这种重新分配
频率
例如
如果你把该参数设置为500
则每次
空间超出时它才重新分配并添加500个新空间
而不是1 个
这样
来
你就可以不用重新分配而添加了另外499个元素空间
这也会大大提高
运行速度
(77)我该如何改变MDI框架窗口
子窗口
大小以使在窗口以
定
大小打开?
在视中
OnInitialUpdate
中
GetParentFrame
GetParentFrame会返回
指向
保存有该视
框架窗口
指针
然后
在框架窗口上
MoveWindow
(78)在我
某些部分
我可以
MessageBox
来建立
个信息对话框
例如在视类中
但是
在其它部分我却不能
如文档类中
为什么?我怎样才能在我
应用
类中建立
个信息对话框?
MessageBox
来自CWnd 类
所以你只能在从CWnd继承
类(如CView )中
它
但是
MFC也提供了AfxMessageBox
你可以在任何地方
它
(79)我需要在我
中设置全局变量
以使文档中
所有类都能访问
我应该吧它放到哪儿?
把该变量放到该应用
类
头文件中
attribute处
然后
在
任何地方
你都可以用下面
思路方法来访问该变量:
CMyApp *app = (CMyApp *)AfxGetApp
;
app->MyGlobalVariable = ...
(80)我听说MFC可以发现内存漏洞
我怎样使用该特性?
如果你在Debug菜单中
Go选项(不是Project菜单中
Execute选项)来运行你
应用
MFC 应该在
终止时报告内存漏洞
如果没有
那么试试运行MFC Tracer工具
(在VC
组中)
并启动跟踪
然后返回应用
(81)我怎样才能在我
应用
中循环浏览已经打开
文档?
使用CDocTemplate中未公开
GetFirstDocPosition
和GetNextDoc
(82)才能在我
应用
中循环浏览已经打开
视?
使用CDocument 中未公开
GetFirstViewPosition
和GetNextView
(83)
PreCreateWindow是干什么用
?
PreCreateWindow允许你在
CreateWindow 的前来改变窗口属性
(84)该怎样防止MFC在窗口标题栏上把文档名预置成应用
名?
在PreCreateWindow
中删除FWS_PREFIXTITLE标志
窗口样式:
cs.style &= ~FWS_PREFIXTITLE;
(85)我应该怎样防止MFC在窗口标题栏上添加文档名?
在PreCreateWindow
中删除FWS_ADDTOTITLE 标志
窗口样式:
cs.style &= ~FWS_ADDTOTITLE ;
(86)我应该如何改变视窗口
大小?
视窗口实际上是框架窗口
子窗口
所以你必须改变框架窗口
大小
而不是改变视窗口
使用CView类中
GetParentFrame
获得指向框架窗口
指针
然后
MoveWindow
来改变框架
大小
这会使变尺寸
视充满框架窗口
(87)我有
无模式对话框
我怎样才能在窗口退出时删除CDialog对象?
把“delete this”加到PostNcDestroy中
这主要用在需要自动删除对象
场合
(88)为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?
OnNcDestroy只被已建立
窗口
如果建立窗口失败(如PreCreateWindow )
则没有窗口处来发送WM_NCDESTROY消息
PostNcDestroy是在对象窗口被完全删除
在OnNcDestroy后
甚至在窗口建立失败的后
(89)File菜单中
MRU列表是从哪儿来
?列表中
名字放在哪儿了?我怎样才能改变列表中项目
最大值?
在应用
类
InitInstance
中对LoadStdProfileSettings
中
该
接受
个参数(在缺省情况下如果没有传递值则为4 )
MRU文件名是从INI文件中
如果你有带有ID_FILE_MRU_FILE1
ID
菜单选项
它会为调入
MRU列表所替换
如果你改变传递给 LoadStdProfileSettings
数值(最大为16 )
则你就改变了所装如文件名
最大值
(90)我在菜单中添加了新
项
但是
当我选该项时
在状态栏上没有出现任何提示信息
为什么?
打开资源文件中
菜单模板
打开新菜单选项
属性对话框
在对话框
底部
Prompt 编辑框中
你可以如下指定状态栏上
提示信息和工具栏上
提示信息(如果你已经建立
工具栏按钮):
Status bar
"nFlying tag
(91)我怎样才能在应用
缺省系统菜单中加上
些东西?
系统菜单和其它菜单类似
你可以添加或删除项目
这需要使用CMenu类
成员
下面
代码在你
系统菜单后面添加
个新菜单项:
CMenu *sysmenu;
sysmenu = m_pMainWnd->Get
Menu(FALSE);
sysmenu->AppendMenu(MF_STRING, 1000, "xxx");
参见MFC帮助文件中
CMenu 类
(92)我建立了
个对话框
但是当我显示该对话框时
第
个编辑框总是不能获得焦点
我必须单击它来使它获得焦点
我怎样才能使第
个编辑框在对话框打开时就获得焦点?
打开资源编辑器中
对话框模板
在Layout菜单中选择Tab Order 选项
按你
需求单击对话框中
控制来重新排列这些控制
tab顺序
(93)我怎样才能使
个窗口具有“always _disibledevent=>如果 ZipCode 列被定义为
串时不会出现问题
如果定义为long
则会出现“Internal Application Error”对话框
这是由于类型不匹配
缘故
如果你删除27111
单引号
则不会出现问题
当你看到“Internal Application Error”时
最好检查
下试图要发送给数据库
SQL语句
(97)我用ClassWizard建立了
个类
但是
我把名字取错了
我想把它从项目中删除
应该如何做?
在ClassWizard对话框关闭后
用文件管理器删除新类
H 和CPP文件
然后打开ClassWizard
它会提示丢失了两个文件
并询问你该如何做
你可以选择从项目中删除这两个问
按钮
(98)当我打开应用
中
窗口时
我要传递该窗口
矩形尺寸
该矩形指定了窗口
外围大小
但是当我
GetClientRect时
所得到
尺寸要比所希望
值要小(
工具栏和窗口边框
缘故)
有其它思路方法来计算窗口
尺寸吗?
参见CWnd::CalcWindowRect
(99)我在文档类中设置了
个整型变量
但是
当我试图把该变量写入Serialize
中
archive文件中时
出现了类型
而文档中
其它变量没有问题
为什么?
archive 类只重载某些类型
>>和<<操作符
“
”类型没有在其中
也许是
变量在Windows 3.1和Windows NT/95有所区别
缘故吧
“long”类型得到了支持
所以你可以把
类型改成long型
参见MFC帮助文件中CArchive类
(100)如何控制菜单
大小?
我用MFC
CMenu生成了
个动态菜单(例如File,Edit,View...Help), 我想控制这个菜单
大小(长+高).
思路方法
:查找 WM_MEASUREITEM 和 MEASUREITEMSTRUCT.
思路方法 2:查询系统::Get
Metric(SM_CXMENUSIZE).
/* 你可以通过如下代码来获得文本
大小:
(A)获得被使用
字体 */
NONCLIENTMETRICS ncm;
HFONT hFontMenu;
SIZE size;
size.cy = size.cy = 0;
mem
(&ncm, 0,
(NONCLIENTMETRICS));
ncm.cbSize =
(NONCLIENTMETRICS);
(
ParametersInfo(SPI_GETNONCLIENTMETRICS,
(NONCLIENTMETRICS), &ncm, 0))
{
hFontMenu = CreateFontIndirect(&ncm.lfMenuFont);
/*
(B) 获得菜单项
文本: */
char szText[_MAX_PATH];
pMenu->GetMenuString(0, szText, _MAX_PATH, MF_BYPOSITION);
/*
然后,获得菜单项文本
高度: */
HFONT hFontOld;
HDC hDC;
hDC = ::GetDC(NULL);
hFontOld = (HFONT) ::SelectObject(hDC, hFontMenu);
GetTextExtentPo
32(hDC, szText, lstrlen(szText), &size);
SelectObject(hDC, hFontOld);
::ReleaseDC(NULL, hDC);
}
/*此时,size.cy即为高度,size.cx为宽度,你可以给菜单加上自定义
高度和宽度,通过比较,我发现宽度为4
比较合适
*/
(101)改变LVIS_SELECTED
状态颜色?
我想将CListCtrl项和CTreeCtrl项在LVIS_SELECTED状态时
颜色变灰.
思路方法
:查找
CustomDraw,它是IE4提供
公共控制,允许有你自己
代码.
思路方法 2:生成
个drawControl控件,然后在DrawItem中处理文本颜色.
(102)如何只存储文档
某
部分?
我只想存储文档
某
部分,能否象使用文件
样使用文档?(也就是有定位
).将每个CArchive类设置为CFile类
派生类,这样你就能使用Seek等成员
.
(103)保存工具条菜单有bug吗?
使用浮动菜单条时,SaveBarState和LoadBarState出现了问题.如果菜单是浮动
,重起应用
时它会出现在左上角,而它固定在屏幕其它位置时,下
次启动就会出现在该位置,这是什么原因?你试试这个PToolBar->Create(this,...,ID_MYTOOLBAR);
你
工具条需要包括id,而不是象默认
工具条那样.
(104)Tip of the day
bug
我创建了
个简单
mdi应用
,使用.BSF(自定义
文档扩展名)作为它
文档我保存
个foo.bsf文档后,可以在资源管理器中双击该文件打开mdi应用
同时打开foo.bsf文档.但当我给mdi应用
加上a tip of the day组件的后,从资源管理器中双击foo.bsf后,就会给我
个警告:ASSERT(::IsWindow(m_hWnd)),然后mdi应用
就死那了.
当从dde启动应用
(例如:双击相关文档)时,"Tip of the Day"是有bug
.你可以看看
"ShowTipAtStartup",它在"InitInstance"中
,可以看到tip of the day作为
个模式对话框显示,在处理其它消息时它
直进行消息循环你可心修改ShowTipAtStartup使其从dde启动时不出现tip of the day.
void CTipOfApp::ShowTipAtStartup(void)
{
// CG: This function added by 'Tip of the Day' component.
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
(
cmdInfo.m_bShowSplash &&
cmdInfo.m_nShellCommand != CCommandLineInf:FileDDE
)
{
CTipDlg dlg;
(dlg.m_bStartup)
dlg.DoModal
;
}
}
如果还有其它bug,你可以设定cmdInfo.m_nShellCommand
过滤.
(105)如何可以让我
可以显示在其它
窗口上面?
让用户选择"总是在最上面"最好是在系统菜单里加入
个选项.可以通过修改WM_SYSCOMMAND消息来发送用户
选择.菜单
命令标识(id)会作为
个参数传给OnSysCommand
.要定义标识(id),将如下代码加入到CMainFrame.CPP中:
#
WM_ALWAYSONTOP WM_USER + 1
将"总在最上面"
菜单项加入到系统菜单中,将如下代码加入到
CMainFrame::OnCreate
中:
CMenu* pSysMenu = Get
Menu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, WM_ALWAYSONTOP,
"&Always _disibledevent=>
nHeightOff
= rectWindow.Height
- rectClient.Height
;
lpMMI->ptMinTrackSize.x = MINX + nWidthOff
;
lpMMI->ptMinTrackSize.y = MINY + nHeightOff
;
lpMMI->ptMaxTrackSize.x = MAXX + nWidthOff
;
lpMMI->ptMaxTrackSize.y = MAXY + nHeightOff
;
}
第 2步,在CFrameWnd
继承类
PreCreateWindow
中去掉WS_MAXIMIZEBOX消息,否则在最大化时你将得不到预料
结果.
BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~WS_MAXIMIZEBOX;
CFrameWnd::PreCreateWindow(cs);
}
(107)如何改变窗口框架
颜色?
MDI框架
客户区被另
个窗口
框架所覆盖.为了改变客户区
背景色,你需要重画这个客户窗口.为了做到这点,你要处理消息WM_ERASEBKND产生
个新类,从CWnd继承,姑且称的为CMDIClient.给它加上
个成员变量,
#
"MDIClient.h"
CMainFrame : public CMDIFrameWnd
{
...
protected:
CMDIClient m_wndMDIClient;
}
在CMainFrame中重载CMDIFrameWnd::OnCreateClient
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )
{
m_wndMDIClient.Sub
Window(m_hWndMDIClient);
TRUE;
}
FALSE;
}
然后就可以加入对消息WM_ERASEBKGND
处理了.
(108)如何将应用
窗口置于屏幕正中?
要将你
应用
窗口放置在屏幕正中央,只须在MainFrame
OnCreate
中加入:
CenterWindow( GetDesktopWindow
);
标签:
vc用法
下载文章的 PDF文档电子版 离线看
0
我顶
相关文章
读者评论
发表评论
昵称:
内容:
更多
热门标签
event.keycode13
(2)
网游常用术语
(2)
vb基本数据类型
(2)
vbrecordset.find
(2)
vbsubfunction
(2)
10itemsorless
(2)
turboc2.0
(2)
词法分析器代码
(2)
算法与程序设计
(2)
归并算法
(2)
vc消息
(2)
c语言单链表
(2)
mdi窗口
(2)
回文数
(2)
linux线程编程
(2)
语言学概论试卷
(2)
ip地址的分配
(2)
函数定义域
(2)
实型数据
(2)
程序设计语言发展
(2)
RSS订阅
更多
精华推荐
ASP.NET vs. PHP,哪个更快?摘自infoq
疯狂代码,大型网站架构系列之五,缓存策略设计概要
C#多线程教程系列之四,简单的多线程通讯(实例代码)
疯狂代码,大型网站架构系列之四,多对多关系的以及并发缓存的设计
卑鄙无耻的猫扑公司,无耻的联盟,黑心联盟
关于这次疯狂代码生成器的改版,以及一些抓图
原创,使用轮廓以及扇形扫描实现qq的验证码识别
疯狂代码,大型网站架构系列之三,多对多关系的优化设计
疯狂代码,大型网站架构系列之二,底层架构概论
疯狂代码,大型网站架构系列之一,前言,不得不考虑的问题
更多
最新标签
jspajax自动刷新
(1)
php上传代码
(1)
联想2155
(1)
micboost什么意思
(1)
atmega16ucosii
(1)
虚拟主机usb
(1)
vc用法
(1)
跟踪技术
(1)
usb主机前言
(1)
fourierspace
(1)
oracle字符替换
(1)
strategy设计模式
(1)
java的序列化
(1)
css超链接样式
(1)
多媒体开发平台
(1)
soa坏处
(1)
开源软件soa益处
(1)
soa应用技巧
(1)
计算机网络安全漏洞
(1)
soa策略
(1)
RSS订阅
更多
Dig排行
疯狂代码生成器简介
sql语句大全:常用 SQL 语句大全
网游外挂:在内存中修改数据的网游外挂--Delphi
QQ协议概述
sql触发器:如何在SQL Server中使用触发器
C#多线程教程系列之一,多线程入门,实例代码
会员登陆代码 一个最简单的会员登陆代码
疯狂代码,大型网站架构系列之一,前言,不得不考虑的问题
疯狂代码,大型网站架构系列之二,底层架构概论
Flash文字特效
RSS订阅
更多
阅读排行
疯狂代码生成器简介
会员登陆代码 一个最简单的会员登陆代码
sql语句大全:常用 SQL 语句大全
C#多线程教程系列之一,多线程入门,实例代码
疯狂代码,大型网站架构系列之一,前言,不得不考虑的问题
好听的空间名字:c#中的名字空间
u盘文件夹被隐藏:手动清除仿文件夹图标U盘病毒
疯狂代码,大型网站架构系列之二,底层架构概论
疯狂代码,大型网站架构系列之三,多对多关系的优化设计
卑鄙无耻的猫扑公司,无耻的联盟,黑心联盟
RSS订阅
更多
最新文章
Photoshop调色:制作室内人物粉青色照片
photoshop修改照片:Photoshop制作糖果色手机人物照片
Photoshop调色:制作外景照片柔和的中性色美女
Photoshop教程:快速修改照片构图
色图片:Photoshop调出严重偏色照片淡红的中性色
点击这里:首个SOA国家标准完成相关意见征求稿
点击这里:全国信标委SOA标准工作组成立大会即将召开
soa坏处:SOA的好处、坏处以及尴尬的处
开源软件soa益处:解读开源软件SoftwareSOA解决方案益处
Sun:让云计算由虚无缥缈走到实实在在