??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产亚洲AV影院,久久综合久久伊人,久久夜色精品国产噜噜噜亚洲AVhttp://www.shnenglu.com/zgysx/category/2783.html抒写快乐心情zh-cnFri, 25 Jul 2008 12:38:19 GMTFri, 25 Jul 2008 12:38:19 GMT60异常处理http://www.shnenglu.com/zgysx/archive/2008/07/23/56926.htmlwarriorwarriorWed, 23 Jul 2008 05:07:00 GMThttp://www.shnenglu.com/zgysx/archive/2008/07/23/56926.htmlhttp://www.shnenglu.com/zgysx/comments/56926.htmlhttp://www.shnenglu.com/zgysx/archive/2008/07/23/56926.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/56926.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/56926.html#include <string>

#include 
<stdio.h>
#include 
<windows.h>
#include 
<dbghelp.h>

#pragma comment(lib, 
"Dbghelp.lib")

#define _INNER_TEST 1

#if _DEBUG & !defined( _INNER_TEST )
#define GS_EXCEPTION_BEGIN()
#define    GS_EXCEPTION_END()
#else
#define EXCEPTION_BEGIN() __try {
#define    EXCEPTION_END() } __except( MyUnhandledFilter( GetExceptionInformation() ) ) {}
#endif




LONG WINAPI MyUnhandledFilter(
struct _EXCEPTION_POINTERS * lpExceptionInfo)
{
    LONG ret 
= EXCEPTION_EXECUTE_HANDLER;

    TCHAR szFileName[
64];
    SYSTEMTIME st;
    ::GetLocalTime(
&st);
    wsprintf(szFileName, TEXT(
"%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, /*rand()*/100);

    HANDLE hFile 
= ::CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    
if (hFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION ExInfo;

        ExInfo.ThreadId 
= ::GetCurrentThreadId();
        ExInfo.ExceptionPointers 
= lpExceptionInfo;
        ExInfo.ClientPointers 
= false;

        BOOL bOK 
= MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );

        
if (bOK)
        {
            printf(
"Create Dump File Success!\n");
        }
        
else
        {
            printf(
"MiniDumpWriteDump Failed: %d\n", GetLastError());
        }

        ::CloseHandle(hFile);
    }
    
else
    {
        printf(
"Create File %s Failed %d\n", szFileName, GetLastError());
    }

    std::
string strTip;
    
switch( lpExceptionInfo->ExceptionRecord->ExceptionCode )
    {
    
case STATUS_ACCESS_VIOLATION:
        {
            
char sz[200= {0};
            sprintf( sz, 
"内存讉K冲突 Access violation, Attempt to %s data at address %p",  lpExceptionInfo->ExceptionRecord->ExceptionInformation[0? "write" : "read", lpExceptionInfo->ExceptionRecord->ExceptionInformation[1]);
            strTip 
= sz;
        }
        
break;

    
case STATUS_BREAKPOINT:
        strTip 
= "用户断点 Breakpoint";
        
break;

    
case STATUS_DATATYPE_MISALIGNMENT:
        strTip 
= "内存地址寚w错误 Address misaligned";
        
break;
#ifdef STATUS_FLOATING_DIVIDE_BY_ZERO
    
case STATUS_FLOATING_DIVIDE_BY_ZERO:
            strTip 
= L"点数除Cؓ0 Floating point divide by 0";
            
break;

    
case STATUS_FLOATING_OVERFLOW:
        strTip 
= L"点数溢?nbsp;Floating point overflow" ;
        
break;

    
case STATUS_FLOATING_UNDERFLOW:
        strTip 
= L"点数溢?nbsp;Floating point underflow";
        
break;

    
case STATUS_FLOATING_RESEVERED_OPERAND:
        strTip 
= L"保留的QҎ格式 Reserved Floating point format" ;
        
break;
#endif

    
case STATUS_ILLEGAL_INSTRUCTION:
        strTip 
= "非法指o Illegal instruction" ;
        
break;

    
case STATUS_PRIVILEGED_INSTRUCTION:
        strTip 
= "Ҏ指o Priviledged instruction" ;
        
break;

    
case STATUS_INTEGER_DIVIDE_BY_ZERO:
        strTip 
= "0除数错误 Integer divide by 0" ;
        
break;

    
case STATUS_INTEGER_OVERFLOW:
        strTip 
= "整数溢出 Integer overflow" ;
        
break;

    
case STATUS_SINGLE_STEP:
        strTip 
= "单步执行 Single step" ;
        
break;

    
default:
        strTip 
= "未定义错?nbsp;Undefined error.";
    }

    printf( 
"发生错误的位|是 %p \n %s\n", lpExceptionInfo->ExceptionRecord->ExceptionAddress, strTip.c_str() );

    
return ret;
}


int _tmain(int argc, _TCHAR* argv[])
{
    
//::SetUnhandledExceptionFilter(MyUnhandledFilter);

    EXCEPTION_BEGIN()
    
int a = 0;
    
int b = 2;
    
//int c = b/a;
    int * p = (int *)1;
    
*= 2;
    strcpy( NULL, NULL );
    
    EXCEPTION_END()
    
return 0;
}



warrior 2008-07-23 13:07 发表评论
]]>
在桌面徏立快h?/title><link>http://www.shnenglu.com/zgysx/archive/2007/01/08/17415.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Mon, 08 Jan 2007 02:25:00 GMT</pubDate><guid>http://www.shnenglu.com/zgysx/archive/2007/01/08/17415.html</guid><wfw:comment>http://www.shnenglu.com/zgysx/comments/17415.html</wfw:comment><comments>http://www.shnenglu.com/zgysx/archive/2007/01/08/17415.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/zgysx/comments/commentRss/17415.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zgysx/services/trackbacks/17415.html</trackback:ping><description><![CDATA[    在阅M码之前,先看一下关于“快h式”组件的l构C意图?br /><br /> <img height="128" src="http://www.vckbase.com/document/journal/vckbase43/images/comtut4pic2.jpg" width="296" border="0" /><br />图二、快h式组件的接口l构C意?br /><br />  从结构图中可以看出,“快h式”组?CLSID_ShellLink)Q有3个(其实不止Q接口,每个接口完成一l相兛_能的函数?IShellLink 接口(IID_IShellLink)提供快捷方式的参数读写功能(见图三)QIPersistFile 接口(IID_IPersistFile)提供快捷方式持箋性文件的d功能。对象的持箋??)Q是一个非常常用,q且功能强大的接口家族。但今天Q我们只要了解其中两函数Q就可以了:IPersistFile::Save()和IPersistFile:Load()??)<br /><br /> <img height="412" src="http://www.vckbase.com/document/journal/vckbase43/images/comtut4pic3.jpg" width="367" border="0" /><br />图三、快h式中的各U属?pre>#include < atlconv.h > void CreateShortcut(LPCTSTR lpszExe, LPCTSTR lpszLnk) { // 建立块捷方式 // 参数 lpszExe: EXE 文g全\径名 // 参数 lpszLnk: 快捷方式文g全\径名 ::CoInitialize( NULL ); IShellLink * psl = NULL; IPersistFile * ppf = NULL; HRESULT hr = ::CoCreateInstance( // 启动lg CLSID_ShellLink, // 快捷方式 CLSID NULL, // 聚合??) CLSCTX_INPROC_SERVER, // q程?Shell32.dll)服务 IID_IShellLink, // IShellLink ?IID (LPVOID *)&psl ); // 得到接口指针 if ( SUCCEEDED(hr) ) { psl->SetPath( lpszExe ); // 全\径程序名 // psl->SetArguments(); // 命o行参? // psl->SetDescription(); // 备注 // psl->SetHotkey(); // 快捷? // psl->SetIconLocation(); // 图标 // psl->SetShowCmd(); // H口寸 // Ҏ EXE 的文件名Q得到目录名 TCHAR szWorkPath[ MAX_PATH ]; ::lstrcpy( szWorkPath, lpszExe ); LPTSTR lp = szWorkPath; while( *lp ) lp++; while( ''\\'' != *lp ) lp--; *lp=0; // 讄 EXE E序的默认工作目? psl->SetWorkingDirectory( szWorkPath ); hr = psl->QueryInterface( // 查找持箋性文件接口指? IID_IPersistFile, // 持箋性接?IID (LPVOID *)&ppf ); // 得到接口指针 if ( SUCCEEDED(hr) ) { USES_CONVERSION; // 转换?UNICODE 字符? ppf->Save( T2COLE( lpszLnk ), TRUE ); // 保存 } } if ( ppf ) ppf->Release(); if ( psl ) psl->Release(); ::CoUninitialize(); } void OnXXX() { CreateShortcut( _T("c:\\winnt\\notepad.exe"), // C本程序。注意,你的pȝ是否也是q个目录Q? _T("c:\\Documents and Settings\\Administrator\\桌面\\我的C?lnk") ); // 桌面上徏立快h?lnk)文g的全路径名。注意,你的pȝ是否也是q个目录Q? // 如果用程序实现寻找桌面的路径Q则可以查注册表 // HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders } </pre><img src ="http://www.shnenglu.com/zgysx/aggbug/17415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zgysx/" target="_blank">warrior</a> 2007-01-08 10:25 <a href="http://www.shnenglu.com/zgysx/archive/2007/01/08/17415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让List Control有Check Box ?让List Box有Check Boxhttp://www.shnenglu.com/zgysx/archive/2006/12/30/17030.htmlwarriorwarriorSat, 30 Dec 2006 05:30:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/12/30/17030.htmlhttp://www.shnenglu.com/zgysx/comments/17030.htmlhttp://www.shnenglu.com/zgysx/archive/2006/12/30/17030.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/17030.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/17030.html 1.让List Control有Check Box
用SetExtendedStyleҎ可以讄Q看代码Q?br />QCListCtrl m_ListCtrl;Q?/p>

DWORD dwStyle = m_ListCtrl.GetStyle();
dwStyle |= LVS_EX_CHECKBOXES;
m_ListCtrl.SetExtendedStyle(dwStyle);

2.让List Box有Check Box
首先Q声明Control变量的时候用CCheckListBox代替CListBox?br />然后Q将List Box的Has Strings属性改为TrueQ把Ower Draw属性改为Fixed?/p>

warrior 2006-12-30 13:30 发表评论
]]>
在Static控g中显CBMPhttp://www.shnenglu.com/zgysx/archive/2006/12/30/17029.htmlwarriorwarriorSat, 30 Dec 2006 05:28:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/12/30/17029.htmlhttp://www.shnenglu.com/zgysx/comments/17029.htmlhttp://www.shnenglu.com/zgysx/archive/2006/12/30/17029.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/17029.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/17029.html首先Q给Static控gd一个Control变量QID要改了以后才能添加变量,也就是说ID不能为IDC_STATICQ,本例为m_staticTest?br />然后Q用ModifyStyle函数修改Static控g的StyleQ让它可以显C图片:

m_staticTest.ModifyStyle(0, SS_BITMAP | SS_CENTERIMAGE);

最后,是Load文g昄出来Q?/p>

CRect rect;
m_staticTest.GetWindowRect(&rect);

//  下面的方法是按照Static控g的大显CbmpQ如果要安装囄实际大小昄Q用q个ҎLoad囄Q?br />//  HBITMAP hBmp = (HBITMAP)::LoadImage(0, _T("D:\\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HBITMAP hBmp = (HBITMAP)::LoadImage(0, _T("D:\\test.bmp"), IMAGE_BITMAP, rect.Width(), rect.Height(), LR_LOADFROMFILE);

m_staticTest.SetBitmap(hBmp);
DeleteObject(hBmp);



warrior 2006-12-30 13:28 发表评论
]]>
[转]VC 界面开?常见的问?/title><link>http://www.shnenglu.com/zgysx/archive/2006/12/28/16952.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Thu, 28 Dec 2006 09:54:00 GMT</pubDate><guid>http://www.shnenglu.com/zgysx/archive/2006/12/28/16952.html</guid><wfw:comment>http://www.shnenglu.com/zgysx/comments/16952.html</wfw:comment><comments>http://www.shnenglu.com/zgysx/archive/2006/12/28/16952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zgysx/comments/commentRss/16952.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zgysx/services/trackbacks/16952.html</trackback:ping><description><![CDATA[ <h2> <a id="viewpost1_TitleUrl" href="/mzty/archive/2006/11/14/15149.html"> <font size="3">VC 常见的问?/font> </a> <font size="3"> <br /> <br /> <font color="#000000">Q?Q?如何在程序中获得其他E序?图标?<br />两种Ҏ:<br />(1) SDK函数 SHGetFileInfo 或?ExtractIcon获得图标资源?handle,<br />(2) SDK函数 SHGetFileInfo 获得有关文g的很多信?如大图?属? cd{?</font> </font> </h2> <h2> <font size="3"> <font color="#808080"> <font color="#000000">void CSampleView:<br />OnDraw(CDC * pDC)<br />{<br />if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,<br />&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))<br />{<br />pDC ->DrawIcon(10,10,stFileInfo.hIcon)<br />}<br />}<br />Example(2):同样功能,Use ExtractIcon Function<br />void CSampleView:: OnDraw(CDC *pDC)<br />{<br />HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T<br />("NotePad.exe"),0)<br />if (hIcon &&hIcon!=(HICON)-1)<br />pDC->DrawIcon(10,10,hIcon)<br />}</font> <br /> </font> <br />    说明: 获得notepad.exe的\径正规上来说用GetWindowsDirectory函数得到, 如果是调?win95下的ȝQ应该用讉K注册表的Ҏ获得其\径,要作成一个比较考究的程序,考虑应该全面? </font> </h2> <div id="zxxpbdt" class="postbody"> <div id="dbzfzbl" class="postbody"> <div id="xbxbxnv" class="postcontent"> <p> <br /> <br />Q?Q?如何改变H口的图?<br />向窗口发?WM_SECTION消息?br />Example:<br />HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON)<br />ASSERT(hIcon)<br />AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM)hIcon)<br /></p>Q?Q?如何窗口居中显C?<br />Call Function CWnd::CenterWindows()<br /><br />Example(1):<br />Center Window( ) //Relative to it's parent<br />// Relative to Screen<br />Example(2):<br />CenterWindow(CWnd:: GetDesktopWindow( ))<br />//Relative to Application's MainWindow<br />AfxGetMainWnd( ) ->CenterWindow( )<br /><p><br /> </p><p>Q?2Q?如何创徏一个字回绕的CEditView<br />重蝲CWnd : : PreCreateWindow和修改CREATESTRUCTl构Q关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位, ׃CEditView : : PreCreateWindow昄讄cs. styleQ调用基cd数后要修改cs . style?br /><br />BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs)<br />{<br />//First call basse class function .<br />BOOL bResutl =CEditView : : PreCreateWindow (cs)<br /><br />// Now specify the new window style .<br />cs.style &= ~ (ES_AUTOHSCROLL |WS_HSCROLL)<br />return bResult<br />}<br /></p><p><br />Q?7Q?如何单击除了H口标题栏以外的区域使窗口移?br />当窗口需要确定鼠标位|时Windows向窗口发送WM_NCHITTEST信息Q可以处理该信息使Windows认ؓ鼠标在窗口标题上。对于对话框和基于对话的应用E序Q可以用ClassWizard处理该信息ƈ调用基类函数Q?如果函数q回HTCLIENT 则表明鼠标在客房区域Q返回HTCAPTION表明鼠标在Windows的标题栏中?br />UINT CSampleDialog : : OnNcHitTest (Cpoint point )<br />{<br />UINT nHitTest =Cdialog: : OnNcHitTest (point )<br />return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest<br />}<br /><br />上述技术有两点不利之处Q?br />其一是在H口的客户区域双LQ窗口将极大Q?br />其二Q?它不适合包含几个视窗的主框窗口?br />q有一U方法,当用h下鼠标左键LH口认ؓ鼠标在其H口标题上,使用ClassWizard在视H中处理WM_LBUTTODOWN信息q向LH口发送一个WM_NCLBUTTONDOWN信息和一个单L试HTCAPTION?br />void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point<br />)<br />{<br />CView : : OnLButtonDow (nFlags , pont )<br /><br />//Fool frame window into thinking somene clicked<br />on<br />its caption bar .<br />GetParentFrame ( ) ?gt; PostMessage (<br />WM_NCLBUTTONDOWN ,<br />HTCAPTION , MAKELPARAM (poitn .x , point .y) )<br /><br />}<br />该技术也适用于对话框和基于对的应用程序,只是不必调用<br />CWnd: :GetParentFrame ?br />void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )<br />{<br />Cdialog : : OnLButtonDow (nFlags, goint )<br />//Fool dialog into thinking simeone clicked on its<br />caption bar .<br />PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x<br />, point. y<br />) )<br />}</p><p>Q?8Q?如何改变视窗的背景颜?br />Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用ClassWizard重蝲该消息的~省处理E序来擦除背景(实际是画Q,q返回TRUE以防止Windows擦除H口?br />//Paint area that needs to be erased.<br />BOOL CSampleView : : OnEraseBkgnd (CDC* pDC)<br />{<br />// Create a pruple brush.<br />CBrush Brush (RGB (128 , 0 , 128) )<br /><br />// Select the brush into the device context .<br />CBrush* pOldBrush = pDC?gt;SelcetObject (&brush)<br /><br />// Get the area that needs to be erased .<br />CRect reClip<br />pDC?gt;GetCilpBox (&rcClip)<br />//Paint the area.<br />pDC?gt; PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY )<br /><br />//Unselect brush out of device context .<br />pDC?gt;SelectObject (pOldBrush )<br /><br />// Return nonzero to half fruther processing .<br />return TRUE<br />}</p><p>Q?0Q?如何防止LH口在其说明中显C活动的文档?br />创徏LH口和MDI子窗口进通常hFWS_ADDTOTITLE风格位,如果不希望在说明中自动添加文档名Q?必须止该风gQ?可以使用ClassWizard重置<br />CWnd: : PreCreateWindowq关闭FWS_ADDTOTITLE风格?br />BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)<br />{<br />//Turn off FWS_ADDTOTITLE in main frame .<br />cs.styel & = ~FWS_ADDTOTITLE  <br />return CMDIFrameWnd : : PreCreateWindow (cs )<br />}<br />关闭MDI子窗口的FWS _ADDTOTITLE风格创Z个具有空标题的窗口,可以调用CWnd: : SetWindowText来设|标题。记住自p|标题时要遵循接口风格指南?/p><p>Q?1Q?如何获取有关H口正在处理的当前消息的信息<br />调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如,可以使用ClassWizard几个菜单项处理E序映射C个函CQ然后调用GetCurrentMessage来确定所选中的菜单项?br />viod CMainFrame : : OnCommmonMenuHandler ( )<br />{<br />//Display selected menu item in debug window .<br />TRACE ("Menu item %u was selected . \n" ,</p><p>Q?2Q?如何在代码中获取工具条和状态条的指?br />~省Ӟ 工作框创建状态条和工h时将它们作ؓLH口的子H口Q状态条有一个AFX_IDW_STATUS_BAR标识W,工具条有一个AFX_IDW_TOOLBAR标识W,下例说明了如何通过一赯用CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子H口的指针:<br />//Get pointer to status bar .<br />CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )<br />?gt; GetDescendantWindow(AFX_IDW_STUTUS_BAR)<br /><br />//Get pointer to toolbar .<br />CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )<br />?gt; GetDescendantWindow(AFX_IDW_TOOLBAR)</p><p>Q?3Q?如何使能和禁止工h的工hC?br />如果讄了CBRS_TOOLTIPS风格位,工具条将昄工具提示Q要使能或者禁止工hC,需要设|或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函敎ͼ<br />void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )<br />{<br />ASSERT_VALID (m_wndToolBar)<br /><br />DWORD dwStyle = m _wndToolBar.GetBarStyle ( )<br /><br />if (bDisplayTips) dwStyle ?CBRS_TOOLTIPS<br /><br />else<br />dwStyle & = ~CBRS_TOOLTIPS<br /><br />m_wndToolBar.SetBarStyle (dwStyle )<br />}</p><p>Q?4Q?如何创徏一个不规则形状的窗?br />可以使用新的SDK函数SetWindowRgn。该函数绘d鼠标消息限定在窗口的一个指定的区域Q实际上使窗口成为指定的不规则Ş状?使用AppWizard创徏一个基于对的应用程序ƈ使用资源~辑器从d话资源中删除所在的~省控g、标题以及边界?br />l对话类增加一个CRgn数据成员Q以后要使用该数据成员徏立窗口区域?br />Class CRoundDlg : public CDialog<br />{<br />?br />private :<br />Crgn m_rgn : // window region<br />?br />}<br />修改OnInitDialog函数建立一个椭圆区域ƈ调用SetWindowRgn该区域分配l窗口:<br />BOOL CRoundDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//Get size of dialog .<br />CRect rcDialog<br />GetClientRect (rcDialog )<br /><br />// Create region and assign to window .<br />m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) )<br />SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE )<br /><br />return TRUE<br />}<br /><br />通过建立区域和调用SetWindowRgnQ已l徏立一个不规则形状的窗口,下面的例子程序是修改OnPaint函数使窗口Ş状看h象一个球形体?br />voik CRoundDlg : : OnPaint ( )<br />{<br />CPaintDC de (this) // device context for painting<br />.<br />//draw ellipse with out any border<br />dc. SelecStockObject (NULL_PEN)<br />//get the RGB colour components of the sphere color<br />COLORREF color= RGB( 0 , 0 , 255)<br />BYTE byRed =GetRValue (color)<br />BYTE byGreen = GetGValue (color)<br />BYTE byBlue = GetBValue (color)<br /><br />// get the size of the view window<br />Crect rect<br />GetClientRect (rect)<br /><br />// get minimun number of units<br />int nUnits =min (rect.right , rect.bottom )<br /><br />//calculate he horiaontal and vertical step size<br />float fltStepHorz = (float) rect.right /nUnits<br />float fltStepVert = (float) rect.bottom /nUnits<br /><br /><br />int nEllipse = nUnits/3 // calculate how many to<br />draw<br />int nIndex<br />// current ellipse that is being draw<br /><br />CBrush brush<br />// bursh used for ellipse fill color<br />CBrush *pBrushOld // previous<br />brush that was selected into dc<br />//draw ellipse , gradually moving towards upper-right<br />corner<br />for (nIndex = 0 nIndes < + nEllipse nIndes++)<br />{<br />//creat solid brush<br />brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ).<br />( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)<br />/nEllipse ) ) )<br /><br />//select brush into dc<br />pBrushOld= dc .SelectObject (&brhsh)<br /><br />//draw ellipse<br />dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,<br />rect. right -( (int) fltStepHorz * nIndex )+ 1,<br />rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1)<br /><br />//delete the brush<br />brush.DelecteObject ( )<br />}<br />}<br /><br />最后,处理WM_NCHITTEST消息Q当击打窗口的M位置时能UdH口?br />UINT CRoundDlg : : OnNchitTest (Cpoint point )<br />{<br />//Let user move window by clickign anywhere on thewindow .<br />UINT nHitTest = CDialog : : OnNcHitTest (point)<br />rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest<br /><br />}</p><p>Q?7Q?如何创徏和用无模式对话?br />MFC模式和无模式对话封装在同一个类中,但是使用无模式对话需要几个对话需要几个额处的步骤。首先,使用资源~辑器徏立对话资源ƈ使用ClassWizard创徏一个CDialog的派生类。模式和无模式对话的中止是不一LQ模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用CWnd: : DestroyWindow来中止的Q函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindowq|无模式对话的函数?br />void CSampleDialog : : OnOK ( )<br />{<br />// Retrieve and validate dialog data .<br />if (! UpdateData (TRUE) )<br />{<br />// the UpdateData rountine<br />will set focus to correct item TRACEO (" UpdateData failed during dialog termination .\n")<br />return<br />}<br /><br />//Call DestroyWindow instead of EndDialog .<br />DestroyWindow ( )<br />}<br /><br />void CSampleDialog : : OnCancel ( )<br />{<br />//Call DestroyWindow instead of EndDialog .<br />DestroyWindow ( )<br />}<br /><br />其次Q需要正删除表C对话的C++对象。对于模式对来说Q这很容易,需要创建函数返回后卛_删除C++对象Q无模式对话不是同步的,创徏函数调用后立卌回,因而用户不知道何时删除C++对象。撤销H口时工作框调用CWnd : : PostNcDestroyQ可以重|该函数q执行清除操作,诸如删除this指针?br />void CSampleDialog : : PostNcDestroy ( )<br />{<br />// Declete the C++ object that represents this dialog.<br />delete this<br />}<br /><br />最后,要创建无模式对话。可以调用CDialog : : DoModal创徏一个模式对放,要创Z个无模式对话则要调用CDialog: : Create。下面的例子说明 了应用程序是如何创徏无模式对话的Q?象;无模式对话不是同步的Q创建函数调用后立即q回Q?br />void CMainFrame : : OnSampleDialog ( )<br />{<br />//Allocate a modeless dialog object .<br />CSampleDilog * pDialog =new CSampleDialog<br />ASSERT_VALID (pDialog) Destroy ( )<br /><br />//Create the modeless dialog . represents this dialog.<br />BOOL bResult = pDialog ?gt; Create (IDD_IDALOG)<br />ASSERT (bResult )<br />}<br /></p><p></p><p>Q?8Q?如何防止LH口在其说明中显C活动的文档?br />创徏LH口和MDI子窗口进通常hFWS_ADDTOTITLE风格位,如果不希望在说明中自动添加文档名Q?必须止该风gQ?可以使用ClassWizard重置<br />CWnd: : PreCreateWindowq关闭FWS_ADDTOTITLE风格?br />BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)<br />{<br />//Turn off FWS_ADDTOTITLE in main frame .<br />cs.styel & = ~FWS_ADDTOTITLE  <br />return CMDIFrameWnd : : PreCreateWindow (cs )<br />}<br />关闭MDI子窗口的FWS _ADDTOTITLE风格创Z个具有空标题的窗口,可以调用CWnd: : SetWindowText来设|标题。记住自p|标题时要遵循接口风格指南?/p><p><br />Q?0Q?怎样加蝲其他的应用程?<br />三个SDK函数 winexec, shellexecute,createprocess可以使用?br />WinExec最单,两个参数Q前一个指定\径,后一个指定显C方?后一个参数值得说一下,比如泥用 SW_SHOWMAXMIZED方式d载一个无最大化按钮的程序,是Neterm,calc{等Q就不会出现正常的窗体,但是已经被加CQ务列表里了?br /><br />ShellExecute?WinExex灉|一点,可以指定工作目录,下面的Example是直接打开 c:\temp\1.txt,而不用加载与 txt文g兌的应用程?很多安装E序完成后都会打开一个窗口,来显CReadme or Faq,我猜是q么作的?<br /><br />ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED)<br /><br />CreateProcess最复杂Q一共有十个参数Q不q大部分都可以用NULL代替Q它可以指定q程的安全属性,l承信息Q类的优先{等.来看个很单的Example:<br />STARTUPINFO stinfo<br />//启动H口的信?br />PROCESSINFO procinfo //q程的信?br /><br />CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,<br />NORMAL_PRIORITY_<br /><br />CLASS,NULL,NULL, &stinfo,&procinfo)<br /></p><p><br />Q?2Q?如何使能和禁止工h的工hC?br />如果讄了CBRS_TOOLTIPS风格位,工具条将昄工具提示Q要使能或者禁止工hC,需要设|或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函敎ͼ<br />void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )<br />{<br />ASSERT_VALID (m_wndToolBar)<br /><br />DWORD dwStyle = m _wndToolBar.GetBarStyle ( )<br /><br />if (bDisplayTips) dwStyle ?CBRS_TOOLTIPS<br /><br />else<br />dwStyle & = ~CBRS_TOOLTIPS<br /><br />m_wndToolBar.SetBarStyle (dwStyle )<br />}<br /><br />//Get pointer to toolbar .<br />CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )<br />?gt; GetDescendantWindow(AFX_IDW_TOOLBAR)</p><p>Q?3Q?如何讄工具条标?br />工具条是一个窗口,所以可以在调用CWnd : : SetWindowText来设|标题,例子如下Q?br />int CMainFrame : : OnCreate (LPCREATESTRUCT lpCreateStruct )<br />{<br />?br />// Set the caption of the toolbar .<br />m_wndToolBar.SetWindowText (_T "Standdard")<br /></p><p>}<br /><br />Q?6Q?如何改变对话或窗体视H的背景颜色<br />调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色Q第二个参数指定了文本颜艌Ӏ下例将应用E序对话讄色背景和黄色文本?br />BOOL CSampleApp : : InitInstance ( )<br />{<br />?br />//use blue dialog with yellow text .<br />SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 ,255 , 0 ) )<br />?br />}<br /><br />需要重d话(或对话的子控ӞӞWindows向对话发送消息WM_CTLCOLORQ通常用户可以让Windows选择l画背景的刷子,也可重置该消息指定刷子。下例说明了创徏一个红色背景对话的步骤?br /><br />首先Q给对话基类增加一人成员变?br />CBursh :class CMyFormView : public CFormView<br />{<br />?br /><br />private :<br />CBrush m_ brush // background brush<br /><br />?br />}<br /><br />其次Q?在类的构造函C刷子初始化为所需要的背景颜色?br />CMyFormView : : CMyFormView ( )<br />{<br />// Initialize background brush .<br />m_brush .CreateSolidBrush (RGB ( 0, 0, 255) )<br />}<br /><br />最后,使用ClassWizard处理WM_CTLCOLOR消息q返回一个用来绘d话背景的刷子句柄。注意:׃当重d话控件时也要调用该函敎ͼ所以要nCtlColor参量?br />HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor<br />)<br /><br />{<br />// Determine if drawing a dialog box . If we are, return +handle to<br />//our own background brush . Otherwise let windows handle it .<br />if (nCtlColor = = CTLCOLOR _ DLG )<br />return (HBRUSH) m_brush.GetSafeHandle ( )<br />return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor<br />)<br />}</p><p></p><p>Q?9Q?如何改变控g的字?br />׃控g是也是窗口,用户可以调用CWnd: : SetFont指定新字体。该函数用一个Cfont指针Q要保证在控件撤消之前不能撤消字体对象。下例将下压按钮的字体改?点Arial字体Q?br />//Declare font object in class declaration (.H file ).<br />private : Cfont m_font<br />// Set font in class implementation (.Cpp file ). Note m_wndButton is a<br />//member variable added by ClassWizard.DDX routines hook the member<br />//variable to a dialog button contrlo.<br />BOOL CSampleDialog : : OnInitDialog ( )<br />{<br />?br />//Create an 8-point Arial font<br />m_font . CreateFont (MulDiv (8 , -pDC<br />?gt; GetDeviceCaps(LOGPIXELSY) ,72). 0 , 0 , 0 , FW_NORMAL , 0 , 0,0, ANSI_CHARSER, OUT_STROKE_PRECIS ,<br /><br />CLIP_STROKE _PRECIS , DRAFT _QUALITY<br />VARIABLE_PITCH |FF_SWISS, _T("Arial") )<br /><br />//Set font for push button .<br />m_wndButton . SetFont (&m _font )<br /><br />?br />}</p><p>Q?0Q?如何在OLE控g中用OLE_COLOR数据cd<br />诸如COleControl : : GetFortColor和COleControl : : GetBackColor{函数返回OLE _COLOR数据cd的颜Ԍ而GDI对象诸如W和刷子使用的是COLORREF数据cdQ调用COleControl : : TranslateColor可以很容易地OLE_COLORcd改ؓCOLORREFcd。下例创Z一个当前背景颜色的刷子Q?br /><br />void CSampleControl : : OnDraw (CDC* pdc<br />const Crect& rcBounds , const Crect& rcInvalid<br />)<br />{<br />//Create a brush of the cuttent background color.<br />CBrush brushBack (TranslateColor (GetBackColor () ) )<br /><br />//Paint the background using the current backgroundcolor .<br />pdc?gt; FilllRect (rcBounds , &brushBack)<br /><br />//other drawign commands<br /><br />?br />}</p><p>Q?2Q?Z么旋转按钮控件看h倒{<br />需要调用CSpinCtrl : : SetRange 讄旋{按钮控g的范_旋{按钮控g的缺省上限ؓ0Q缺省下限ؓ100Q这意味着增加时旋转按控g的值由100变ؓ0。下例将旋{按钮控g的范围设|ؓ0?00Q?br />BOOL CAboutDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//set the lower and upper limit of the spin button<br />m_wndSpin . SetRange ( 0 ,100 )<br /><br />return TRUE<br />}<br /><br />Visual C++ 4.0 Print对话中的Copise旋{按钮控g也有同样的问题:按下Up按钮时拷贝的数目减少Q而按下Down 按钮时拷贝的数目增加?/p><p>Q?3Q?Z么旋转按钮控件不能自动地更新它下面的~辑控g<br />如果使用旋{按钮的autu buddyҎ, 则必M证在对话的标记顺序中buddyH口优先于旋转按钮控件。从Layout菜单中选择Tab Order菜单(或者按下Crtl+DQ可以设|对话的标签序?/p><p>Q?4Q?如何用位图显CZ压按?br />Windows 95按钮有几处新的创建风|其是BS_BITMAP和BS_ICONQ要惛_有位图按钮,创徏按钮和调用CButton : : SetBitmap或CButton : : SetIcon时要指定BS_BITMAP或BS_ICON风格?br /><br />首先Q设|按钮的图标属性。然后,当对话初始化时调用CButton: : SetIcon。注意:下例用图标代替位图,使用位图时要心Q因Z知道背景所有的颜色——ƈ非每个h都用浅灰色?br /><br />BOOL CSampleDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//set the images for the push buttons .<br />BOOL CSampleDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//set the images for the push buttons .<br />m_wndButton1.SetIcon (AfxGetApp ( ) ?gt; LoadIcon (IDI _ IPTION1))<br />m_wndButton2.SetIcon (AfxGetApp ( ) ?gt; LoadIcon (IDI _ IPTION2))<br />m_wndButton3.SetIcon (AfxGetApp ( ) ?gt; LoadIcon (IDI _ IPTION3))<br /><br />return TRUE<br />}</p><p></p><p>Q?5Q?如何一个创Z态下压按?br />可以使用新的BS_PUSHBUTTON 风格位和框以及按钮来创Z个三态下压按钮。这很容易,只需检框和按钮拖拉到对话中ƈ指定属性Push—like卛_。不用Q何附加程序就可以成ؓ三态下压按钮?/p><p>Q?6Q?如何动态创建控?br />分配一个控件对象的实例q调用其Create成员函数。开发者最Ҏ忽略两g事:忘记指定WS_VISBLE标签和在栈中分配控g对象。下例动态地创徏一个下压按钮控Ӟ<br />//In class declaration (.H file ).<br />private : CButton* m _pButton<br /><br />//In class implementation (.cpp file ) .<br />m_pButton =new CButton<br />ASSERT_VALID (m_pButton)<br />m_pButton ?gt;Create (_T ("Button Title ") , WS_CHILD |WS_VISIBLE |BS_PUSHBUTTON. Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )</p><p>Q?7Q?如何限制~辑框中的准许字W?br />如果用户在编辑控件中只允许接收数字,可以使用一个标准的~辑控gq指定新的创建标志ES_NUMBERS,它是Windows 95新增加的标志Q该标志限制 ~辑控g只按收数字字W。如果用户需要复杂的~辑控gQ可以用Microsoft 的屏蔽编辑控Ӟ它是一个很有用的OLE定制控g?br />如果希望不用OLE 定制控g自己处理字符Q可以派生一个CEditcdƈ处理WM_CHAR消息Q然后从~辑控g中过滤出特定的字W。首先,使用ClassWizard建立一?CEdit的派生类Q其ơ,在对话类中指定一个成员变量将~辑控g分类在OnInitdialog 中调用CWnd: : SubclassDlgItem .<br /><br />//In your dialog class declaration (.H file )<br />private : CMyEdit m_wndEdit // Instance of your new edit control .<br /><br />//In you dialog class implementation (.CPP file )<br />BOOL CSampleDialog : : OnInitDialog ( )<br />{<br />?br /><br />//Subclass the edit lontrod .<br />m_wndEdit .SubclassDlgItem (IDC_EDIT,this)<br /><br />?br />}<br /><br />使用ClassWizard处理WM_CHAR消息Q计nChar参量q决定所执行的操作,用户可以定是否修改、传送字W。下例说明了如何昄字母字符Q如果字W是字母字符Q则调用CWnd OnCharQ否则不调用OnChar.<br />//Only display alphabetic dharacters .<br />void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )<br />{<br />//Determine if nChar is an alphabetic character.<br />if (: : IsCharAlpha ( ( TCHAR) nChar ) )<br />CEdit : : OnChar (nChar, nRepCnt , nFlags )<br />}<br /><br />如果要修改字W,则不能仅仅简单地用修改过的nChar调用CEdit: : OnCharQ然后CEdit: : OnChar调用CWnd: : Default获取原来的wParam 和lParam 的|q样是不行的。要修改一个字W,需要首先修改nCharQ然后用修改q的nChar调用CWnd: : DefWindowProc。下例说明了如何字W{变ؓ大写Q?br />//Make all characters uppercase<br />void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )<br />{<br />//Make sure character is uppercase .<br />if (: : IsCharAlpha ( .( TCHAR) nChar)<br />nChar=: : CharUpper(nChar )<br /><br />//Bypass default OnChar processing and directly call<br />//default window proc.<br />DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt, nFlags ))<br />}</p><p>Q?8Q?如何改变控g的颜?br />有两U方法。其一Q可以在父类中指定控件的颜色Q或者利用MFC4.0新的消息反射在控件类中指定颜艌Ӏ?当控仉要重新着色时Q工作框调用父窗口(通常是对话框Q的CWnd: : OnCrtlColor,可以在父H口cM重置该函数ƈ指定控g的新的绘d性。例如,下述代码对话中的所有编辑控件文本颜色改为红Ԍ<br />HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)<br /><br />{<br />HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor )<br /><br />//Draw red text for all edit controls .<br />if (nCtlColor= = CTLCOLOR_EDIT )<br />pDC ?gt; SetTextColor (RGB (255, 0 , 0 , ) )<br /><br />return hbr<br />}<br /><br />然而,׃每个父窗口必d理通知消息q指定每个控件的l画属性,所以,q种Ҏ不是完全的面向对象的Ҏ。控件处理该消息q指定绘d性更合情合理。消息反允许用戯样做。通知消息首先发送给父窗口,如果父窗口没有处理则发送给控g。创Z个定制彩色列表框控g必须遵@下述步骤?br /><br />首先Q用ClassWizard 创徏一个CListBox 的派生类qؓ该类d下述数据成员?br />class CMyListBox publilc CListBox<br />{<br />?br />private<br />COLORREF m_clrFor // foreground color<br />COLORREF m_clrBack //background color<br />Cbrush m_brush //background brush<br />?br />}<br />其次Q在cȝ构造函CQ初始化数据中?br />CMyListBox : : CMyListBox ()<br />{<br />//Initialize data members .<br />m_clrFore =RGB (255 , 255 , 0) //yellow text<br />m_clrBack=RGB (0 , 0 , 255) // blue background<br />m_brush . CreateSolidBrush (m _clrBack )<br />}<br /><br />最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息q指定新的绘d性?br />HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )<br />{<br />pDC?gt;SetTextColor (m_clrFore)<br />pDC?gt;SetBkColor (m_clrBack)<br /><br />return (HBRUSH) m_brush.GetSafeHandle ()<br />}<br />现在Q控件可以自己决定如何绘画,与父H口无关?/p><p>Q?9Q?当向列表框中d多个Ҏ如何防止闪烁<br />调用CWnd::SetRedraw 清除重画标志可以止CListBoxQ或者窗口)重画。当向列表框d几个ҎQ用户可以清除重L志,然后d,最后恢复重L志。ؓ保重画列表框的新项Q调用SetRedraw (TRUE) 之后调用CWnd::Invalidate?br />//Disable redrawing.<br />pListBox->SetRedraw (FALSE)<br /><br />//Fill in the list box gere<br />//Enable drwing and make sure list box is redrawn.<br />pListBox->SetRedraw (TRUE)<br />pListBox->Invalidate ()</p><p>Q?0Q?如何向编辑控件中d文本<br />׃没有CEdit:: AppendText函数Q用户只好自己做此项工作。调用CEdit:: SetSelUd到编辑控件末,然后调用CEdit:: ReplaceSeld文本。下例是AppendText 的一U实现方法:<br /><br />void CMyEdit:: AppendText (LPCSTR pText)<br />{<br />int nLen=GetWindowTextLength ()<br />SetFocus ()<br />SetSel (nLen, nLen)<br /><br />ReplaceSel (pText)<br />}</p><p>Q?1Q?如何讉K预定义的GDI对象<br />可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象,诸如刷子、笔以及字体。下例用了Windows预定义的W和刷子GDI对象在视H中M个椭圆?br />//Draw ellipse using stock black pen and gray brush.<br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />//Determine size of view.<br />CRect rcView<br />GetClientRect (rcView)<br /><br />//Use stock black pen and stock gray brush to draw ellipse.<br />pDC->SelectStockObject (BLACK_PEN)<br />pDC->SelectStockObject (GRAY_BRUSH)<br />//Draw the ellipse.<br />pDC->Ellipse (reView)<br />}<br /><br />也可以调用新的SDK函数GetSysColorBrush获取一个系l颜色刷子,下例用背景色在视H中M个椭圆:<br />void CsampleView:: OnDraw (CDC* pDC)<br />{<br />//Determine size of view.<br />CRect rcView<br />GetClientRect (rcView)<br /><br />//Use background color for tooltips brush.<br />CBrush * pOrgBrush=pDC->SelectObject ( CBrush ::FromHandle( ::GetSysColorBrush (COLOR_INFOBK)))<br /><br />//Draw the ellipse.<br />pDC->Ellipse (rcView)<br /><br />//Restore original brush.<br />pDC->SelectObject (pOrgBrush)<br />}</p><p>Q?2Q?如何获取GDI对象的属性信?br />可以调用GDIObject:: GetObject。这个函数将指定图表讑֤的消息写入到~冲区。下例创Z几个有用的辅助函数?br />//Determine if font is bold.<br />BOOL IsFontBold (const CFont&font)<br />{<br />LOGFONT stFont<br />font.GetObject (sizeof (LOGFONT), &stFont)<br />return (stFont.lfBold)? TRUE: FALSE<br />}<br /><br />//Return the size of a bitmap.<br />CSize GetBitmapSize (const CBitmap&bitmap)<br />{<br />BITMAP stBitmap<br />bitmap.GetObject (sizeof (BITMAP), &stBitmap)<br />return CSize (stBitmap.bmWidth, stBitmap.bmHeight)<br />}<br /><br />//Create a pen with the same color as a brush.<br />BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush)<br />{<br />LOGBRUSH stBrush<br />brush.Getobject (sizeof (LOGBRUSH), &stBrush)<br />return pen. Createpen (PS_SOLID, 0, stBrush.ibColor)<br />}</p><p>Q?3Q?如何实现一个橡皮区矩Ş<br />CRectTracker是一个很有用的类Q可以通过调用CRectTracker::TrackRubberBand 响应WM_LBUTTONDOWN消息来创Z个橡皮区矩Ş?br />下例表明使用CRectTrackerUd和重|视H中的蓝色椭圆的大小是很Ҏ的事情?br /><br />首先Q在文g档中声明一个CRectTracker数据成员Q?br />class CSampleView : Public CView<br />{<br />?br />public :<br />CrectTracker m_tracker<br />?br />}<br /><br />其次Q在文cȝ构造函C初始化CRectTracker 对象Q?br />CSampleDoc:: CSampleDOC ()<br />{<br />//Initialize tracker position, size and style.<br />m_tracker.m_rect.SetRect (0, 0, 10, 10)<br />m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker ::dottedLine<br />}<br /><br />然后Q在OnDraw函数中画椭圆和踪q矩形:<br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />CSampleDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoc)<br /><br />//Select blue brush into device context.<br />CBrush brush (RGB (0, 0, 255))<br />CBrush* pOldBrush=pDC->SelectObject (&brush)<br /><br />//draw ellipse in tracking rectangle.<br />Crect rcEllipse<br />pDoc->m_tracker.GetTrueRect (rcEllipse)<br />pDC->Ellipse (rcEllipse)<br /><br />//Draw tracking rectangle.<br />pDoc->m_tracker.Draw (pDC)<br />//Select blue brush out of device context.<br />pDC->Selectobject (pOldBrush)<br />}<br /><br />最后,使用ClassWizard处理WM_LBUTTONDOWN消息Qƈ增加下述代码。该D代码根据鼠标击键情况可以拖放、移动或者重|椭圆的大小?br />void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)<br />{<br />//Get pointer to document.<br />CSampleDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoc)<br /><br />//If clicked on ellipse, drag or resize it.Otherwise create a<br />//rubber-band rectangle nd create a new ellipse.<br />BOOL bResult=pDoc->m_tracker.HitTest (point)!= CRectTracker::hitNothing<br /><br />//Tracker rectangle changed so update views.<br />if (bResult)<br />{<br />pDoc->m_tracker.Track (this,point,TRue)<br />pDoc->SetModifiedFlag ()<br />pDoc->UpdateAllViews (NULL)<br />}<br /><br />else<br />pDoc->m-tracker.TrackRubberBand(this,point,TRUE)<br />CView:: onLButtonDown (nFlags,point)<br />}</p><p>Q?4Q?如何更新{背景颜色的文?br />调用CDC:: SetBkmodeq传送OPAQUE用当前的背景颜色填充背景Q或者调用CDC::SetBkModeq传送TRANSPAARENT使背景保持不变,q两U方法都可以讄背景模式。下例设|背景模式ؓTRANSPARENTQ可以两ơ更CQ用p带黑阴媄更新文本。黑色串在红色串之后Q但׃讄了背景模式仍然可见?br /><br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />//Determint size of view.<br />CRect rcView<br />GetClientRect (rcVieew)<br /><br />//Create sample string to display.<br />CString str (_T ("Awesome Shadow TextQ.Q?))<br />//Set the background mode to transparent.<br />pDC->SetBKMode (TRANSPARENT)<br /><br />//Draw black shadow text.<br />rcView.OffsetRect (1, 1)<br />pDc->SetTextColor (RGB (0, 0, 0))<br />pDC->DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER)<br /><br />//Draw red text.<br />rcView.OffsetRect (-1,-1)<br />pDc->SetTextColor (RGB (255, 0, 0))<br />pDC->DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER)<br /><br />}</p><p>Q?5Q?如何创徏一个具有特定点大小的字?br />可以指定字体逻辑单位的大,但有时指定字体的点的大小可能会更方便一些。可以如下将字体的点转换为字体的高度Q?br /><br />int nHeigth=mulDiv (nPointSize, -dc.GetDeviceCaps (LOGPIXELSY), 72)<br />下例创徏了一?点的Apial字体Q?br />?br />CClientDC dc (AqfxGetMainWnd ())<br /><br />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"))</p><p>Q?6Q?如何计算一个串的大?br />函数CDC:: Det text Extent Ҏ当前选择的字体计一个串的高度和宽度。如果用的不是pȝ字体而是其他字体Q则在调用GetTextExtent之前字体选进讑֤上下文中是很重要的,否则计算高度和宽度时依据系l字体,由此得出的结果当然是不正的。下q样板程序当改变下压按钮的标题时动态调整按钮的大小Q按钮的大小由按钮的字体和标题的大小而定。响应消息WM_SETTEXT时调用OnSetTextQ该消息使用ON_MESSAE宏指令定义的用户自定义消息?br /><br />LRESULT CMyButton:: OnSettext (WPARAM wParam, LPARAM lParam)<br />{<br />//Pass message to window procedure.<br />LRESULT bResult=CallWindowProc (*GetSuperWndProcAddr(), m_hWnd, GetCurrentMessage() ->message,wParam,lParam)<br />//Get title of push button.<br />CString strTitle<br />GetWindowText (strTitle)<br /><br />//Select current font into device context.<br />CDC* pDC=GetDc ()<br />CFont*pFont=GetFont ()<br />CFont*pOldFont=pDC->SelectObject (pFont)<br /><br />//Calculate size of title.<br />CSize size=pDC->GetTextExent (strTitle,strTitle.GetLength())<br /><br />//Adjust the button's size based on its title.<br />//Add a 5-pixel border around the button.<br />SetWindowPos (NULL, 0, 0, size.cx+10, size.cy+10, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE)<br />//Clean up.<br />pDC->SelectFont (pOldFont)<br />ReleaseDC (pDC)<br /><br />return bResult<br />}<br /></p><p>Q?7Q?如何昄旋{文本<br />只要用户使用TrueType或者GDIW或字体可以显C旋转文?有些g讑֤也支持旋转光栅字体)。LOGFONTl构中的ifEscapement成员指定了文本行和x轴的角度Q角度的单位是十分之一度而不是度Q例如,ifEscapement?50表示字体旋{45度。ؓ保所有的字体沿坐标系l的同一方向旋{Q一定要讄ifEscapement成员的CLIP_LH_ANGLES位,否则Q有些字体可能反向旋转。下例用了14点Arial字体每间?5度画一个串?br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />//Determine the size of the window.<br />CRect rcClient<br />GetClientRect (rcClient)<br /><br />//Create sample string.<br />CString str (_T ("WheeeeQ.QI am rotating!"))<br />//Draw transparent, red text.<br />pDC->SetBkMode (TRANSPARENT)<br />pDC->SetTextColor (RGB (255,0,0))<br />CFont font<br />//font object<br />LOGFONT stFont //font definition<br />//Set font attributes that will not change.<br />memset (&stFont, 0, sizeof (LOGFONT))<br />stFont.ifheight=MulDiv (14, -pDC->GetDeviceCaps(LOGPIXELSY), 72)<br />stFont.ifWeight=FW_NORMAL<br />stFont.ifClipPrecision=LCIP_LH_ANGLES<br />strcpy (stFont.lfFaceName, "Arial")<br /><br />//Draw text at 15degree intervals.<br />for (int nAngle=0 nAngle<3600 nAngle+=150)<br />{<br />//Specify new angle.<br />stFont.lfEscapement=nAngle<br /><br />//Create and select font into dc.<br />font.CreateFontIndirect(&stfont)<br />CFont* pOldFont=pDC ->SelectObject(&font)<br /><br />//Draw the text.<br />pDC->SelectObject(pOldFont)<br />font.DelectObjext()<br />}<br />}</p><p></p><p>Q?8Q?如何正确昄包含标签字符的串<br />调用GDI文本l画函数旉要展开标签字符Q这可以通过调用CDC:: TabbedTextOut或者CDC:: DrawTextq指定DT_EXPANDTABS标志来完成。TabbedTextOut函数允许指定标签位的数组Q下例指定每20讑֤单位展开一个标{:<br /><br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />CTestDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoC)<br /><br />CString str<br />str.Format (_T ("Cathy\tNorman\tOliver"))<br />int nTabStop=20 //tabs are every 20 pixels<br />pDC->TabbedtextOut (10, 10, str, 1, &nTabStop, 10)<br />}</p><p>Q?9Q?如何快速地格式化一个CString对象<br />调用CString:: FormatQ该函数和printf函数h相同的参敎ͼ下例说明了如何用Format函数Q?br /><br />//Get size of window.<br />CRect rcWindow<br />GetWindowRect (rcWindow)<br />//Format message string.<br />CString strMessage<br />strMessage.Format (_T ("Window Size (%d, %d)"),<br /><br />rcWindow.Width (), rcWindow.Height ())<br /><br />//Display the message.<br />MessageBox (strmessage)</p><p>Q?0Q?串太长时如何在其末尾昄一个省略号<br />调用CDC:: DrawTextq指定DT_END_ELLIPSIS标志Q这样就可以用小略号取代串末字符使其适合于指定的边界矩Ş。如果要昄路径信息Q指定DT_END_ELLIPSIS标志q省略号取代串中间的字符?br /><br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />CTestDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoc)<br /><br />//Add ellpsis to end of string if it does not fit<br />pDC->Drawtext (CString ("This is a long string"), CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS)<br /><br />//Add ellpsis to middle of string if it does not fit<br />pDC->DrawText (AfxgetApp () ->m_pszhelpfilePath, CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS)<br />}<br /></p><p>Q?1Q?Z么即使调用EnableMenuItem菜单后Q菜单项q处于禁止状?br />需要将CFrameWnd:: m_bAutomenuEnable讄为FALSEQ如果该数据成员为TRUEQ缺省|Q工作框自动地止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜单项?br /><br />//Disable MFC from automatically disabling menu items.<br />m_bAuoMenuEnable=FALSE<br />//Now enable the menu item.<br />CMenu* pMenu=GetMenu ()<br />ASSERT_VALID (pMenu)<br /><br />pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED)</p><p></p><p>Q?2Q?如何l系l菜单添加一个菜单项<br />l系l菜单添加一个菜单项需要进行下qC个步骤:<br />首先Q用Resource Symbols对话Q在View菜单中选择Resource SymbolsQ.Q可以显C对话Q定义菜单项IDQ该ID应大?x0F而小?xF000Q?br />其次Q调用CWnd::GetSystemMenu获取pȝ菜单的指针ƈ调用CWnd:: Appendmenu菜单项d到菜单中。下例给pȝ菜单d两个新的<br />int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)<br />{<br />?br />//Make sure system menu item is in the right range.<br />ASSERT (IDM_MYSYSITEM &0xFFF0)==IDM_MYSYSITEM)<br />ASSERT (IDM-MYSYSITEM<0xF000)<br /><br />//Get pointer to system menu.<br />CMenu* pSysmenu=GetSystemmenu (FALSE)<br />ASSERT_VALID (pSysMenu)<br />//Add a separator and our menu item to system menu.<br />CString StrMenuItem (_T ("New menu item"))<br />pSysMenu->Appendmenu (MF_SEPARATOR)<br />pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem)<br /><br />?br />}<br /><br />现在Q选择pȝ菜单Ҏ用户应进行检。用ClassWizard处理WM_SYSCOMMAND消息q检用戯单的nID参数Q?br />void CMainFrame:: OnSysCommand (UINT nID,LPARAM lParam)<br />{<br />//Determine if our system menu item was selected.<br />if ( (nID & 0xFFF0)==IDM_MYSYSITEM)<br />{<br />//TODO-process system menu item<br />}<br /><br />else<br />CMDIFrameWnd ::OnSysCommand (nID, lParam)<br />}<br />最后,一个设计良好的UI应用E序应当在系l菜单项加亮时在状态条昄一个帮助信息,q可以通过增加一个包含系l菜单基ID的串表的入口来实现?/p><p>Q?3Q?如何定层菜单所占据的菜单行?br />q可以通过单的减法和除法来实现。首先,用户需要计主框窗口的高度和客户区Q其ơ,从主框窗口的高度中减d户区、框边界以及标题的高度;最后,除以菜单栏的高度。下例成员函数是一个计主框菜单所占据的行数的代码实现?br /><br />int CMainFrame:: GetMenuRows ()<br />{<br />CRect rcFrame,rcClient<br />GetWindowRect (rcFrame)<br />GetClientRect (rcClient)<br />return (rcFrame.Height () -rcClient.Height () - :: GetSystemMetrics(SM_CYCAPTION) - (:: getSystemMetrics(SM_CYFRAME) *2)) / :: GetSystemMetrics(SM_CYMENU)<br />}</p><p>Q?4Q?在用L境中如何定pȝ昄元素的颜?br />调用SDK函数GetSysColor可以获取一个特定显C元素的颜色。下例说明了如何在MFC函数CMainFrameWnd:: OnNcPaint中调用该函数讄H口标题颜色?br /><br />void CMiniFrameWnd:: OnNcPaint ()<br />{<br />?br />dc.SetTextColor (:: GetSysColor (m_bActive ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT))<br />?/p><p></p><p>Q?5Q?如何查询和设|系l参?br />在Windows 3.1 SDK中介l过SDK函数SystemParametersInfoQ调用该函数可以查询和设|系l参敎ͼ诸如按键的重复速率讄、鼠标双dgq时间、图标字体以及桌面覆盖位囄{?br /><br />//Create a font that is used for icon titles.<br />LOGFONT stFont<br />? SystemParametersInfo (SPIF_GETICONTITLELOGFONT, sizeof (LOGFONT), &stFont, SPIF_SENDWININICHANGE)<br />m_font.CreateFontIndirect (&stFont)<br /><br />//Change the wallpaper to leaves.bmp.<br />?: SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, _T (" forest.bmp"), SPIF_UPDATEINIFILE)</p><p></p><p>Q?6Q?如何定当前屏幕分L?br />调用SDK函数GetSystemMetricsQ该函数可以索有关windows昄信息Q诸如标题大、边界大以及滚动条大小{等?br /><br />//Initialize CSize object with screen size.<br />CSize sizeScreen (GetSystemMetrics (SM_CXSCREEN),<br />GetSystemMetrics (SM_CYSCREEN))</p><p></p><p>Q?7Q?如何使用一个预定义的Windows光标<br />调用CWinApp:: LoadStandardCursorq传送光标标识符?br />BOOL CSampleDialog:: OnSetCursor (CWnd* pWnd,<br />UINT nHitTest, UINT<br />message)<br />{<br />//Display wait cursor if busy.<br />if (m_bBusy)<br />{<br />SetCursor (AfxGetApp () ->LoadStandardCursor (IDC_WAIT))<br />return TRUE<br />}<br /><br />return CDialog:: OnSetCursor (pWnd. nHitTest,message)<br />}</p><p>Q?8Q?如何索原先的Task Manager应用E序使用的Q务列?br />原先的Task Manager应用E序昄层H口的列表。ؓ了显C列表Q窗口必d见、包含一个标题以及不能被其他H口拥有。调用CWnd:: GetWindow可以索顶层窗口的列表Q调用IsWindowVisible、GetWindowTextLength以及GetOwner可以定H口是否应该在列表中。下例将把TaskManagerH口的标题填充到列表中?br /><br />void GetTadkList (CListBox&list)<br />{<br />CString strCaption<br />//Caption of window.<br /><br />list.ResetContent ()<br />//Clear list box.<br /><br />//Get first Window in window list.<br />ASSERT_VALID (AfxGetMainWnd ())<br />CWnd* pWnd=AfxGetMainWnd () ->GetWindow (GW_HWNDFIRST)<br /><br />//Walk window list.<br />while (pWnd)<br />{<br />// I window visible, has a caption, and does not have an owner?<br />if (pWnd ->IsWindowVisible()<br />&& pWnd ->GetWindowTextLength ()<br />&&! pWnd ->GetOwner ())<br />{<br /><br />//Add caption o window to list box.<br /><br />pWnd ->GetWindowText (strCaption)<br /><br />list.AddString (strCaption)<br />}<br />//Get next window in window list.<br />pWnd=pWnd ->GetWindow(GW_HWNDNEXT)<br />}<br />}</p><p>Q?9Q?如何定Windows和Windowspȝ目录<br />有两个SDK函数可以完成该功能。GetWindowsDirectory和GetSystemDirectoryQ下例说明了如何使用q两个函敎ͼ<br /><br />TCHAR szDir [MAX_PATH]<br />//Get the full path of the windows directory.<br />?: GetWindowsDirectory (szDir, MAX_PATH)<br />TRACE ("Windows directory %s\n", szDir)<br />//Get the full path of the windows system directory.<br />?: GetSystemDirectory (szDir, MAX_PATH)<br />TRACE ("Windows system directory %s\n", szDir)</p><p>Q?0Q?在哪儿创Z文g<br />调用SDK函数GetTemPath可以定临时文g的目录,该函数首先ؓ临时路径TMP环境变量Q如果没有指定TMPQ检TMP环境变量Q然后返回到当前目录。下例说明了如何创徏一个时文件?br /><br />?br />//get unique temporary file.<br />CString strFile<br />GetUniqueTempName (strFile)<br />TRY<br />{<br />//Create file and write data.Note that file is closed<br />//in the destructor of the CFile object.<br />CFile file (strFile,CFile ::modeCreate | Cfile:: modeWrite)<br /><br />//write data<br />}<br /><br />CATCH (CFileException, e)<br />{<br />//error opening file<br />}<br />END_CATCH<br />?br /><br />Void GetuniqueTempName (CString& strTempName)<br />{<br />//Get the temporary files directory.<br />TCHAR szTempPath [MAX_PATH]<br />DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath)<br />ASSERT (dwResult)<br /><br />//Create a unique temporary file.<br />TCHAR szTempFile [MAX_PATH]<br />UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempfile)<br />ASSERT (nResult)<br /><br />strTempName=szTempFile<br />}</p><p>Q?1Q?我怎样才能建立一个等待光?<br />??BeginWaitCursor ?????{???标,??EndWaitCursor ???l??{???标。要 ?意,??????app ????敎ͼ??所 C?<br /><br />    AfxGetApp()->BeginWaitCursor();<br />    // 要做的事<br />    AfxGetApp()->EndWaitCursor();</p><p>Q?2Q?我在MDI框架中有?form 视窗。它有个取消按钮Q我需要当用户按取消按钮时可关闭form视窗。我应该如何关闭该文?<br />??OnCloseDocument ?数?/p><p>Q?3Q?如何讉K桌面H口<br />静态函数CWnd:: GetDesktopWindow q回桌面H口的指针。下例说明了MFC函数CFrameWnd::BeginModalStae是如何用该函数q入内部H口列表的?br /><br />void CFrameWnd::BeginModalState ()<br />{<br />?br />//first count all windows that need to be disabled<br />UINT nCount=0<br />HWND hWnd= :: GetWindow (:: GetDesktopWindow(), GW_CHILD)<br />while (hWnd!=NULL)<br />{<br />if (:: IsWindowEnabled (hwnd)<br />&& CWnd::FromHandlePermanent (hWnd)!=NULL<br />&& AfxIsDescendant (pParent->m_hWnd, hWnd)<br />&& :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0)==0)<br />{<br />++nCount<br />}<br />hWnd=:: GetWindow (hWnd, GW_HWNDNEXT)<br />}<br />?/p><p></p><p> </p><p>Q?6Q?我在我的E序中是了CDWordArray。我向它d了约10,000个整敎ͼq得它变得非常非常慢。ؓ什么会q么p?<br />CDWordArray ????的,??????????l?的最大尺寸。因 此,???????Ӟ?c?????????I?间。不 q??是,?c??????????????l?????I?间。如 ???????????素,所 ?q????????l??????????慢。解 ???????是,?????SetSize ???W????????q?U???????率。例 如,????????|??500Q则 ???l?I???????????q???500 ??I?_???1 个。这 ?一 来,????????????????499 ???I?_q???????E???q???度?/p><p></p><p>Q?7Q?我该如何改变MDI框架H口的子H口的大以使在H口以一定的大小打开?<br />????OnInitialUpdate ?????GetParentFrame ?数。GetParentFrame ?q??一 ??一 ????????H????针。然 ??????H?????MoveWindow?/p><p>Q?8Q?在我的程序的某些部分Q我可以调用 MessageBox 函数来徏立一个信息对话框Q例如在视类中。但是,在其它部分我却不能,如文档类中。ؓ什么?我怎样才能在我的应用程序类中徏立一个信息对话框Q?br />MessageBox ????CWnd c,所 ??????CWnd l???c?( ?CView ) ???它。但 是,MFC ????AfxMessageBox ?敎ͼ??????????它?/p><p></p><p>Q?9Q?我需要在我的E序中设|全局变量Q以使文中的所有类都能讉K。我应该吧它攑ֈ哪儿?<br />?????????E??c???????attribute 处。然 后,?E??????方,???????????????量:<br /><br />    CMyApp *app = (CMyApp *)AfxGetApp();<br />    app->MyGlobalVariable = ...</p><p><br />Q?1Q?我怎样才能在我的应用程序中循环览已经打开的文?<br />使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数?</p><p></p><p>Q?2Q才能在我的应用E序中@环浏览已l打开的视?<br />??CDocument ???开 ?GetFirstViewPosition() ?GetNextView() ?数?/p><p>Q?3Q数PreCreateWindow是干什么用?<br />PreCreateWindow ??????CreateWindow ?????H???性?/p><p>Q?4Q该怎样防止MFC在窗口标题栏上把文名预|成应用E序?<br />?PreCreateWindow ?????FWS_PREFIXTITLE ???H???式:<br /><br />    cs.style &= ~FWS_PREFIXTITLE;</p><p></p><p>Q?5Q?我应该怎样防止MFC在窗口标题栏上添加文名?<br />?PreCreateWindow ?????FWS_ADDTOTITLE ???H???式:<br /><br />    cs.style &= ~FWS_ADDTOTITLE ;</p><p></p><p>Q?6Q?我应该如何改变视H口的大?<br />???H????????H????H?口,所 ????????H????,??????H?口。 ?CView c???GetParentFrame() ????????H????针,????MoveWindow() ?????????。这 ???????????H?口?/p><p>Q?7Q?我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象?<br />把“delete this”加 ?PostNcDestroy 中。这 ????需 ?????????合?/p><p></p><p>Q?8Q?Z么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?<br />OnNcDestroy ??????H???用。如 ???H????( ?PreCreateWindow )Q则 ??H??????WM_NCDESTROY ?息。PostNcDestroy ????H??????除,?OnNcDestroy 后,???H??????????的?/p><p></p><p>Q?9Q?File菜单中的MRU列表是从哪儿来的Q列表中的名字放在哪儿了Q我怎样才能改变列表中项目的最大|<br />???E??c??InitInstance ????LoadStdProfileSettings ???中。该 ????一 ???( ?~??????????????4 )。MRU ?????INI ?????的。如 ?????ID_FILE_MRU_FILE1 ?ID ????,??????MRU ??所 ?换。如 ??????l?LoadStdProfileSettings ???( 最 ??16 )Q则 ?????所 ??????最 ?倹{?/p><p>Q?0Q?我在菜单中添加了新的V但是,当我选该ҎQ在状态栏上没有出CQ何提CZ息。ؓ什?<br />?开 ?????????ѝ打 开 ??????????框。在 ???????Prompt ~????Q你 ????????????C??????????C???( ????l?????????):<br /><br />    Status bar string\nFlying tag<br /></p><p>Q?2Q?我徏立了一个对话框。但是当我显C对话框时Q第一个编辑框L不能获得焦点Q我必须单击它来使它获得焦点。我怎样才能使第一个编辑框在对话框打开时就获得焦点?<br />?开 ??~?????????ѝ在 Layout 菜单 ???Tab Order ?V按 ??需 ???????????????q?????tab ?序?/p><p>Q?3Q?我怎样才能使一个窗口具有“always on top”特?<br />???OnFileNew 后,???InitInstance ?????????码:<br /><br />m_pMainWnd->SetWindowPos(&CWnd::wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);</p><p>(94)   我要为我的form viewd文模板。我先徏立了对话框模板,然后使用ClassWizard建立了基于CFormView的新c,它也是从CDocumentl承来的。我q徏立了相应的资源ƈ在InitInstance中添加了新的文模板。但是,当我试图q行该程序时Q出CAssertion信息。ؓ什?</p><p>form ??????需 ???D??|??????CFromView。确 ?q???|??最 ??????AppWizard ???CFormView ??E?序,q???AppWizard 所 ????????所 ??的Styles Properties。你 ??????????????式:????栏、不 ??和“Child”。把 ??form view ????????q?????了?br /><br />(95)   我在一对话框中有一列表框,我需要tabbed列表框中的项目。但是,当我处理含有tab字符(用AddStringd?的列表项Ӟtab被显C成黑块而没有展开。哪儿出错了?</p><p>??????中,?开 ?????性。确 ???了“Use Tabstops??式。然 后,??????c??OnInitDialog ?????SetTabStops?br /><br />(96)  我徏立了一个应用程序,q用了CRecordsetcR但是,当我q行该程序时Q它试图要访问数据库Qƈl出“Internal Application Error”对话框。我应该怎样?</p><p>????下,???E????????????SQL ?????????????框。例 如,??????子:<br /><br />    set.m_strFilter = "(ZipCode = '27111')";<br />??ZipCode ??????W????????题,?????longQ则 ??现“Internal Application Error”对 ?框,q????c??????~?故。如 ????27111 ???P??????题。当 ??到“Internal Application Error”时Q最 ? ?一 ??????l?????SQL ?句?br /></p><p>(98)     当我打开应用E序中的H口Ӟ我要传递该H口的矩形尺寸。该矩Ş指定了窗口的外围大小Q但是当我调用GetClientRectӞ所得到的尺寸要比所希望的D?因ؓ工具栏和H口Ҏ的缘?。有其它Ҏ来计窗口的寸?</p><p>??CWnd::CalcWindowRect?br /><br />(99)   我在文cM讄了一个整型变量。但是,当我试图把该变量写入Serialize函数中的archive文g中时Q出Ccd错误。而文中的其它变量没有问题。ؓ什?</p><p>archive c??????c???>> ?<< ??W。“int”类 ?????中,?????int ???Windows 3.1 ?Windows NT/95 ?所 ???~??吧。“long”类 ?????持,所 ?????int c????long 型。参 ?MFC ?????CArchive cR?br /></p><p><br />(100)  如何控制菜单的大?<br />我用MFC的CMenu生成了一个动态菜?例如File,Edit,View...Help), 我想控制q个菜单的大???.</p><p>Ҏ一:查找 WM_MEASUREITEM ?MEASUREITEMSTRUCT.<br />Ҏ?查询pȝ::GetSystemMetric(SM_CXMENUSIZE).</p><p>     /* 你可以通过如下代码来获得文本的大小:<br />        (A)获得被用的字体 */</p><p>       NONCLIENTMETRICS ncm;<br />     HFONT hFontMenu;<br />     SIZE size;<br />     size.cy = size.cy = 0;</p><p>     memset(&ncm, 0, sizeof(NONCLIENTMETRICS));<br />     ncm.cbSize = sizeof(NONCLIENTMETRICS);<br />     if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))<br />     {<br />          hFontMenu = CreateFontIndirect(&ncm.lfMenuFont);<br />          /*<br />          (B) 获得菜单的文本: */<br />          char szText[_MAX_PATH];</p><p>          pMenu->GetMenuString(0, szText, _MAX_PATH, MF_BYPOSITION);<br />          /*<br />          然后,获得菜单Ҏ本的高度: */<br />          HFONT hFontOld;<br />          HDC hDC;</p><p>          hDC = ::GetDC(NULL);<br />          hFontOld = (HFONT) ::SelectObject(hDC, hFontMenu);<br />          GetTextExtentPoint32(hDC, szText, lstrlen(szText), &size);<br />          SelectObject(hDC, hFontOld);<br />          ::ReleaseDC(NULL, hDC);<br />     }<br />     /*此时,size.cy即ؓ高度,size.cx为宽?你可以给菜单加上自定义的高度和宽?通过比较,我发现宽度ؓ4</p><p>比较合适?/</p><p><br />(101)  改变LVIS_SELECTED的状态颜?<br />我想CListCtrl和CTreeCtrl在LVIS_SELECTED状态时的颜色变?</p><p>Ҏ一:查找函数CustomDraw,它是IE4提供的公共控?允许有你自己的代?<br />Ҏ?生成一个draw控g,然后在DrawItem中处理文本颜?</p><p>(102)   如何只存储文的某一部分?<br />我只惛_储文的某一部分,能否象用文件一样用文?(也就是有定位函数).每个CArchivec设|ؓCFilecȝzc?q样你就能用Seek{成员函?</p><p>(103)   保存工具条菜单有bug?<br /></p><p>使用动菜单条时,SaveBarState和LoadBarState出现了问?如果菜单是Q动的,重v应用E序时它会出现在左上?而它固定在屏q其它位|时,下一ơ启动就会出现在该位|?q是什么原?你试试这个PToolBar->Create(this,...,ID_MYTOOLBAR);<br />你的工具条需要包括id,而不是象默认的工h那样.</p><p>(104)   Tip of the day的bug</p><p>我创Z一个简单的mdi应用E序,使用.BSF(自定义的文扩展?作ؓ它的文我保存一个foo.bsf文?可以在资源管理器中双击该文g打开mdi应用E序同时打开foo.bsf文.但当我给mdi应用E序加上a tip of the daylg之后,从资源管理器中双击foo.bsf?׃l我一个警?ASSERT(::IsWindow(m_hWnd)),然后mdi应用E序死那了.<br /><br />当从dde启动应用E序(例如:双击相关文)?"Tip of the Day"是有bug?你可以看看函?ShowTipAtStartup",它在"InitInstance"中调?可以看到tip of the day作ؓ一个模式对话框昄,在处理其它消息时它一直进行消息@环你可心修改ShowTipAtStartup使其从dde启动时不出现tip of the day.<br />void CTipOfApp::ShowTipAtStartup(void)<br />        {<br />                // CG: This function added by 'Tip of the Day' component.<br /><br />                CCommandLineInfo cmdInfo;<br />                ParseCommandLine(cmdInfo);<br /><br />                if (<br />                        cmdInfo.m_bShowSplash &&<br />                        cmdInfo.m_nShellCommand != CCommandLineInf:FileDDE<br />                        )<br />                {<br />                        CTipDlg dlg;<br />                        if (dlg.m_bStartup)<br />                                dlg.DoModal();<br />                }<br />        }<br />如果q有其它bug,你可以设定cmdInfo.m_nShellCommand的过?<br /><br />(105)   如何可以让我的程序可以显C在其它的窗口上?<br /><br />让用户选择"L在最上面"最好是在系l菜单里加入一个选项.可以通过修改WM_SYSCOMMAND消息来发送用L选择.菜单的命令标?id)会作Z个参ClOnSysCommand().要定义标?id),如下代码加入到CMainFrame.CPP?<br /><br />    #define WM_ALWAYSONTOP WM_USER + 1<br />?d最上面"的菜单项加入到系l菜单中,如下代码加入到函数CMainFrame::OnCreate()?<br /><br />      CMenu* pSysMenu = GetSystemMenu(FALSE);<br />      pSysMenu->AppendMenu(MF_SEPARATOR);<br />      pSysMenu->AppendMenu(MF_STRING, WM_ALWAYSONTOP,<br />                     "&Always On Top");<br />使用ClassWizard,加入对WM_SYSCOMMAND消息的处?你应该改变消息过滤器,使用pȝ可以处理q个消息.<br />void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)<br />{<br />    switch ( nID )<br />    {<br />    case WM_ALWAYSONTOP:<br /><br />        if ( GetExStyle() & WS_EX_TOPMOST )<br />        {<br />            SetWindowPos(&wndNoTopMost, 0, 0, 0, 0,<br />                SWP_NOSIZE | SWP_NOMOVE);<br />            GetSystemMenu(FALSE)->CheckMenuItem(WM_ALWAYSONTOP,<br />                MF_UNCHECKED);<br />        }<br />        else<br />        {<br />            SetWindowPos(&wndTopMost, 0, 0, 0, 0,<br />                SWP_NOSIZE | SWP_NOMOVE);<br />            GetSystemMenu(FALSE)->CheckMenuItem(WM_ALWAYSONTOP,MF_CHECKED);<br />        }<br /><br />        break;<br /><br />    default:<br />        CFrameWnd::OnSysCommand(nID, lParam);<br />    }<br />}<br /><br />(106)    如何控制H口框架的最大最尺?</p><p>要控制一个框架的的最大最尺?你需要做两g事情.在CFrameWnd的承类中处理消息WM_GETMINMAXINFO,l构MINMAXINFO讄了整个窗口类的限?因此C要考虑工具?卷动条等{的大小.<br /><br />// 最大最尺寸的象素?- CZ<br />#define MINX 200<br />#define MINY 300<br />#define MAXX 300<br />#define MAXY 400<br /><br />void CMyFrameWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)<br />{<br />    CRect rectWindow;<br />    GetWindowRect(&rectWindow);<br /><br />    CRect rectClient;<br />    GetClientRect(&rectClient);<br /><br />      // get offset of toolbars, scrollbars, etc.<br />    int nWidthOffset = rectWindow.Width() - rectClient.Width();<br />    int nHeightOffset = rectWindow.Height() - rectClient.Height();<br /><br />    lpMMI->ptMinTrackSize.x = MINX + nWidthOffset;<br />    lpMMI->ptMinTrackSize.y = MINY + nHeightOffset;<br />    lpMMI->ptMaxTrackSize.x = MAXX + nWidthOffset;<br />    lpMMI->ptMaxTrackSize.y = MAXY + nHeightOffset;<br />}<br />W二?在CFrameWnd的承类的PreCreateWindow函数中去掉WS_MAXIMIZEBOX消息,否则在最大化时你得不到预料的结?<br /><br />BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs)<br />{<br />    cs.style &= ~WS_MAXIMIZEBOX;<br />    return CFrameWnd::PreCreateWindow(cs);<br />}<br /><br />(107)    如何改变H口框架的颜?</p><p>MDI框架的客户区被另一个窗口的框架所覆盖.Z改变客户区的背景?你需要重画这个客L?Z做到q点,你要处理消息WM_ERASEBKND产生一个新c?从CWndl承,姑且UC为CMDIClient.l它加上一个成员变?<br />#include "MDIClient.h"<br />class CMainFrame : public CMDIFrameWnd<br />{<br />...<br />protected:<br />CMDIClient m_wndMDIClient;<br />}<br />在CMainFrame中重载CMDIFrameWnd::OnCreateClient<br />BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)<br />{<br />    if ( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )<br />    {<br />        m_wndMDIClient.SubclassWindow(m_hWndMDIClient);<br />        return TRUE;<br />    }<br />    else<br />        return FALSE;<br />}<br />然后可以加入对消息WM_ERASEBKGND的处理了.<br /><br />(108)    如何应用程序窗口置于屏q正?</p><p>要将你的应用E序H口攄在屏q正中央,只须在MainFrame的OnCreate函数中加?<br />CenterWindow( GetDesktopWindow() );</p></div> </div> </div> <img src ="http://www.shnenglu.com/zgysx/aggbug/16952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zgysx/" target="_blank">warrior</a> 2006-12-28 17:54 <a href="http://www.shnenglu.com/zgysx/archive/2006/12/28/16952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]windows消息大全http://www.shnenglu.com/zgysx/archive/2006/12/28/16946.htmlwarriorwarriorThu, 28 Dec 2006 08:39:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/12/28/16946.htmlhttp://www.shnenglu.com/zgysx/comments/16946.htmlhttp://www.shnenglu.com/zgysx/archive/2006/12/28/16946.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/16946.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/16946.html windows消息大全

消息Q就是指Windows发出的一个通知Q告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用E序。消息本w是作ؓ一个记录传递给应用E序的,q个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来_q个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsgQ?

它在Windows单元中是q样声明的:

type

TMsg = packed record

hwnd: HWND; / /H口句柄

message: UINT; / /消息帔R标识W?

wParam: WPARAM ; // 32位消息的特定附加信息

lParam: LPARAM ; // 32位消息的特定附加信息

time: DWORD; / /消息创徏时的旉

pt: TPoint; / /消息创徏时的鼠标位置

end;

消息中有什么?

是否觉得一个消息记录中的信息像希腊语一P如果是这P那么看一看下面的解释Q?

hwnd 32位的H口句柄。窗口可以是Mcd的屏q对象,因ؓWin32能够l护大多数可视对象的句柄(H口、对话框、按钮、编辑框{??

message 用于区别其他消息的常量|q些帔R可以是Windows单元中预定义的常量,也可以是自定义的帔R?

wParam 通常是一个与消息有关的常量|也可能是H口或控件的句柄?

lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的Q?

因此Q它们之间可以相互{换?

WM_NULL = $0000;

WM_CREATE = $0001;

应用E序创徏一个窗?

WM_DESTROY = $0002;

一个窗口被销?

WM_MOVE = $0003;

Ud一个窗?

WM_SIZE = $0005;

改变一个窗口的大小

WM_ACTIVATE = $0006;

一个窗口被ȀzL失去Ȁzȝ态;

WM_SETFOCUS = $0007;

获得焦点?

WM_KILLFOCUS = $0008;

失去焦点

WM_ENABLE = $000A;

改变enable状?

WM_SETREDRAW = $000B;

讄H口是否能重?

WM_SETTEXT = $000C;

应用E序发送此消息来设|一个窗口的文本

WM_GETTEXT = $000D;

应用E序发送此消息来复制对应窗口的文本到缓冲区

WM_GETTEXTLENGTH = $000E;

得到与一个窗口有关的文本的长度(不包含空字符Q?

WM_PAINT = $000F;

要求一个窗口重画自?

WM_CLOSE = $0010;

当一个窗口或应用E序要关闭时发送一个信?

WM_QUERYENDSESSION = $0011;

当用户选择l束对话框或E序自己调用ExitWindows函数

WM_QUIT = $0012;

用来l束E序q行或当E序调用postquitmessage函数

WM_QUERYOPEN = $0013;

当用L口恢复以前的大小位置Ӟ把此消息发送给某个图标

WM_ERASEBKGND = $0014;

当窗口背景必被擦除Ӟ例在H口改变大小Ӟ

WM_SYSCOLORCHANGE = $0015;

当系l颜色改变时Q发送此消息l所有顶U窗?

WM_ENDSESSION = $0016;

当系l进E发出WM_QUERYENDSESSION消息后,此消息发送给应用E序Q?

通知它对话是否结?

WM_SYSTEMERROR = $0017;

WM_SHOWWINDOW = $0018;

当隐藏或昄H口是发送此消息l这个窗?

WM_ACTIVATEAPP = $001C;

发此消息l应用程序哪个窗口是ȀzȝQ哪个是非激zȝQ?

WM_FONTCHANGE = $001D;

当系l的字体资源库变化时发送此消息l所有顶U窗?

WM_TIMECHANGE = $001E;

当系l的旉变化时发送此消息l所有顶U窗?

WM_CANCELMODE = $001F;

发送此消息来取消某U正在进行的摸态(操作Q?

WM_SETCURSOR = $0020;

如果鼠标引v光标在某个窗口中Ud且鼠标输入没有被捕获Ӟ发消息l某个窗?

WM_MOUSEACTIVATE = $0021;

当光标在某个非激zȝH口中而用h按着鼠标的某个键发送此消息l当前窗?

WM_CHILDACTIVATE = $0022;

发送此消息lMDI子窗口当用户点击此窗口的标题栏,或当H口被激z,UdQ改变大?

WM_QUEUESYNC = $0023;

此消息由Z计算机的训练E序发送,通过WH_JOURNALPALYBACK的hookE序

分离出用戯入消?

WM_GETMINMAXINFO = $0024;

此消息发送给H口当它要改变大小或位|;

WM_PAINTICON = $0026;

发送给最化H口当它图标要被重?

WM_ICONERASEBKGND = $0027;

此消息发送给某个最化H口Q仅当它在画图标前它的背景必被重画

WM_NEXTDLGCTL = $0028;

发送此消息l一个对话框E序L改焦点位|?

WM_SPOOLERSTATUS = $002A;

每当打印理列队增加或减一条作业时发出此消?

WM_DRAWITEM = $002B;

当buttonQcomboboxQlistboxQmenu的可视外观改变时发?

此消息给q些IZg的所有?

WM_MEASUREITEM = $002C;

当button, combo box, list box, list view control, or menu item 被创建时

发送此消息l控件的所有?

WM_DELETEITEM = $002D;

当the list box ?combo box 被销???某些被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息

WM_VKEYTOITEM = $002E;

此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息

WM_CHARTOITEM = $002F;

此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息

WM_SETFONT = $0030;

当绘制文本时E序发送此消息得到控g要用的颜?

WM_GETFONT = $0031;

应用E序发送此消息得到当前控gl制文本的字?

WM_SETHOTKEY = $0032;

应用E序发送此消息让一个窗口与一个热键相兌

WM_GETHOTKEY = $0033;

应用E序发送此消息来判断热键与某个H口是否有关?

WM_QUERYDRAGICON = $0037;

此消息发送给最化H口Q当此窗口将要被拖放而它的类中没有定义图标,应用E序能返回一个图标或光标的句柄,当用h攑֛标时pȝ昄q个图标或光?

WM_COMPAREITEM = $0039;

发送此消息来判定combobox或listbox新增加的的相对位置

WM_GETOBJECT = $003D;

WM_COMPACTING = $0041;

昄内存已经很少?

WM_WINDOWPOSCHANGING = $0046;

发送此消息l那个窗口的大小和位|将要被改变Ӟ来调用setwindowpos函数或其它窗口管理函?

WM_WINDOWPOSCHANGED = $0047;

发送此消息l那个窗口的大小和位|已l被改变Ӟ来调用setwindowpos函数或其它窗口管理函?

WM_POWER = $0048;Q适用?6位的windowsQ?

当系l将要进入暂停状态时发送此消息

WM_COPYDATA = $004A;

当一个应用程序传递数据给另一个应用程序时发送此消息

WM_CANCELJOURNAL = $004B;

当某个用户取消程序日志激zȝ态,提交此消息给E序

WM_NOTIFY = $004E;

当某个控件的某个事g已经发生或这个控仉要得C些信息时Q发送此消息l它的父H口

WM_INPUTLANGCHANGEREQUEST = $0050;

当用户选择某种输入语言Q或输入语言的热键改?

WM_INPUTLANGCHANGE = $0051;

当^台现场已l被改变后发送此消息l受影响的最H口

WM_TCARD = $0052;

当程序已l初始化windows帮助例程时发送此消息l应用程?

WM_HELP = $0053;

此消息显C用h下了F1Q如果某个菜单是ȀzȝQ就发送此消息个此H口兌的菜单,否则?

发送给有焦点的H口Q如果当前都没有焦点Q就把此消息发送给当前ȀzȝH口

WM_USERCHANGED = $0054;

当用户已l登入或退出后发送此消息l所有的H口Q当用户d或退出时pȝ更新用户的具?

讄信息Q在用户更新讄时系l马上发送此消息Q?

WM_NOTIFYFORMAT = $0055;

公用控gQ自定义控g和他们的父窗口通过此消息来判断控g是用ANSIq是UNICODEl构

在WM_NOTIFY消息Q用此控g能某个控g与它的父控g之间q行怺通信

WM_CONTEXTMENU = $007B;

当用h个窗口中点击了一下右键就发送此消息l这个窗?

WM_STYLECHANGING = $007C;

当调用SETWINDOWLONG函数要改变一个或多个 H口的风格时发送此消息l那个窗?

WM_STYLECHANGED = $007D;

当调用SETWINDOWLONG函数一个或多个 H口的风格后发送此消息l那个窗?

WM_DISPLAYCHANGE = $007E;

当显C器的分辨率改变后发送此消息l所有的H口

WM_GETICON = $007F;

此消息发送给某个H口来返回与某个H口有关q的大图标或图标的句柄Q?

WM_SETICON = $0080;

E序发送此消息让一个新的大图标或小图标与某个窗口关联;

WM_NCCREATE = $0081;

当某个窗口第一ơ被创徏Ӟ此消息在WM_CREATE消息发送前发送;

WM_NCDESTROY = $0082;

此消息通知某个H口Q非客户区正在销?

WM_NCCALCSIZE = $0083;

当某个窗口的客户区域必须被核时发送此消息

WM_NCHITTEST = $0084;//Ud鼠标Q按住或释放鼠标时发?

WM_NCPAINT = $0085;

E序发送此消息l某个窗口当它(H口Q的框架必须被绘制时Q?

WM_NCACTIVATE = $0086;

此消息发送给某个H口 仅当它的非客户区需要被改变来显C是Ȁz还是非Ȁzȝ态;

WM_GETDLGCODE = $0087;

发送此消息l某个与对话框程序关联的控gQwiddows控制方位键和TAB键输入q入此控?

通过响应WM_GETDLGCODE消息Q应用程序可以把他当成一个特D的输入控gq能处理?

WM_NCMOUSEMOVE = $00A0;

当光标在一个窗口的非客户区内移动时发送此消息l这个窗?//非客户区为:H体的标题栏及窗

的边框体

WM_NCLBUTTONDOWN = $00A1;

当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息

WM_NCLBUTTONUP = $00A2;

当用户释N标左键同时光标某个窗口在非客户区十发送此消息Q?

WM_NCLBUTTONDBLCLK = $00A3;

当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息

WM_NCRBUTTONDOWN = $00A4;

当用h下鼠标右键同时光标又在窗口的非客户区时发送此消息

WM_NCRBUTTONUP = $00A5;

当用户释N标右键同时光标又在窗口的非客户区时发送此消息

WM_NCRBUTTONDBLCLK = $00A6;

当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息

WM_NCMBUTTONDOWN = $00A7;

当用h下鼠标中键同时光标又在窗口的非客户区时发送此消息

WM_NCMBUTTONUP = $00A8;

当用户释N标中键同时光标又在窗口的非客户区时发送此消息

WM_NCMBUTTONDBLCLK = $00A9;

当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息

WM_KEYFIRST = $0100;

WM_KEYDOWN = $0100;

//按下一个键

WM_KEYUP = $0101;

//释放一个键

WM_CHAR = $0102;

//按下某键Qƈ已发出WM_KEYDOWNQ?WM_KEYUP消息

WM_DEADCHAR = $0103;

当用translatemessage函数译WM_KEYUP消息时发送此消息l拥有焦点的H口

WM_SYSKEYDOWN = $0104;

当用h住ALT键同时按下其它键时提交此消息l拥有焦点的H口Q?

WM_SYSKEYUP = $0105;

当用户释放一个键同时ALT 键还按着时提交此消息l拥有焦点的H口

WM_SYSCHAR = $0106;

当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数译后提交此消息l拥有焦点的H口

WM_SYSDEADCHAR = $0107;

当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数译后发送此消息l拥有焦点的H口

WM_KEYLAST = $0108;

WM_INITDIALOG = $0110;

在一个对话框E序被显C前发送此消息l它Q通常用此消息初始化控件和执行其它d

WM_COMMAND = $0111;

当用户选择一条菜单命令项或当某个控g发送一条消息给它的父窗口,一个快捷键被翻?

WM_SYSCOMMAND = $0112;

当用户选择H口菜单的一条命令或当用户选择最大化或最化旉个窗口会收到此消?

WM_TIMER = $0113; //发生了定时器事g

WM_HSCROLL = $0114;

当一个窗口标准水qx动条产生一个滚动事件时发送此消息l那个窗口,也发送给拥有它的控g

WM_VSCROLL = $0115;

当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息l那个窗口也Q发送给拥有它的控g WM_INITMENU = $0116;

当一个菜单将要被ȀzL发送此消息Q它发生在用戯单条中的某项或按下某个菜单键Q它允许E序在显C前更改菜单

WM_INITMENUPOPUP = $0117;

当一个下拉菜单或子菜单将要被ȀzL发送此消息Q它允许E序在它昄前更改菜单,而不要改变全?

WM_MENUSELECT = $011F;

当用户选择一条菜单项时发送此消息l菜单的所有者(一般是H口Q?

WM_MENUCHAR = $0120;

当菜单已被激zȝh下了某个键(不同于加速键Q,发送此消息l菜单的所有者;

WM_ENTERIDLE = $0121;

当一个模态对话框或菜单进入空载状态时发送此消息l它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等?

WM_MENURBUTTONUP = $0122;

WM_MENUDRAG = $0123;

WM_MENUGETOBJECT = $0124;

WM_UNINITMENUPOPUP = $0125;

WM_MENUCOMMAND = $0126;

WM_CHANGEUISTATE = $0127;

WM_UPDATEUISTATE = $0128;

WM_QUERYUISTATE = $0129;

WM_CTLCOLORMSGBOX = $0132;

在windowsl制消息框前发送此消息l消息框的所有者窗口,通过响应q条消息Q所有者窗口可以通过使用l定的相xC备的句柄来设|消息框的文本和背景颜色

WM_CTLCOLOREDIT = $0133;

当一个编辑型控g要被绘制时发送此消息l它的父H口Q通过响应q条消息Q所有者窗口可以通过使用l定的相xC备的句柄来设|编辑框的文本和背景颜色

WM_CTLCOLORLISTBOX = $0134;

当一个列表框控g要被绘制前发送此消息l它的父H口Q通过响应q条消息Q所有者窗口可以通过使用l定的相xC备的句柄来设|列表框的文本和背景颜色

WM_CTLCOLORBTN = $0135;

当一个按钮控件将要被l制时发送此消息l它的父H口Q通过响应q条消息Q所有者窗口可以通过使用l定的相xC备的句柄来设|按U的文本和背景颜?

WM_CTLCOLORDLG = $0136;

当一个对话框控g要被绘制前发送此消息l它的父H口Q通过响应q条消息Q所有者窗口可以通过使用l定的相xC备的句柄来设|对话框的文本背景颜?

WM_CTLCOLORSCROLLBAR= $0137;

当一个滚动条控g要被绘制时发送此消息l它的父H口Q通过响应q条消息Q所有者窗口可以通过使用l定的相xC备的句柄来设|滚动条的背景颜?

WM_CTLCOLORSTATIC = $0138;

当一个静态控件将要被l制时发送此消息l它的父H口Q通过响应q条消息Q所有者窗口可以通过使用l定的相xC备的句柄来设|静态控件的文本和背景颜?

WM_MOUSEFIRST = $0200;

WM_MOUSEMOVE = $0200;

// Ud鼠标

WM_LBUTTONDOWN = $0201;

//按下鼠标左键

WM_LBUTTONUP = $0202;

//释放鼠标左键

WM_LBUTTONDBLCLK = $0203;

//双击鼠标左键

WM_RBUTTONDOWN = $0204;

//按下鼠标右键

WM_RBUTTONUP = $0205;

//释放鼠标右键

WM_RBUTTONDBLCLK = $0206;

//双击鼠标右键

WM_MBUTTONDOWN = $0207;

//按下鼠标中键

WM_MBUTTONUP = $0208;

//释放鼠标中键

WM_MBUTTONDBLCLK = $0209;

//双击鼠标中键

WM_MOUSEWHEEL = $020A;

当鼠标轮子{动时发送此消息个当前有焦点的控?

WM_MOUSELAST = $020A;

WM_PARENTNOTIFY = $0210;

当MDI子窗口被创徏或被销毁,或用h了一下鼠标键而光标在子窗口上时发送此消息l它的父H口

WM_ENTERMENULOOP = $0211;

发送此消息通知应用E序的主H口that已经q入了菜单@环模?

WM_EXITMENULOOP = $0212;

发送此消息通知应用E序的主H口that已退Z菜单循环模式

WM_NEXTMENU = $0213;

WM_SIZING = 532;

当用h在调整窗口大时发送此消息l窗口;通过此消息应用程序可以监视窗口大和位置也可以修改他?

WM_CAPTURECHANGED = 533;

发送此消息 l窗口当它失LL鼠标Ӟ

WM_MOVING = 534;

当用户在UdH口时发送此消息Q通过此消息应用程序可以监视窗口大和位置也可以修改他们;

WM_POWERBROADCAST = 536;

此消息发送给应用E序来通知它有关电源管理事Ӟ

WM_DEVICECHANGE = 537;

当设备的g配置改变时发送此消息l应用程序或讑֤驱动E序

WM_IME_STARTCOMPOSITION = $010D;

WM_IME_ENDCOMPOSITION = $010E;

WM_IME_COMPOSITION = $010F;

WM_IME_KEYLAST = $010F;

WM_IME_SETCONTEXT = $0281;

WM_IME_NOTIFY = $0282;

WM_IME_CONTROL = $0283;

WM_IME_COMPOSITIONFULL = $0284;

WM_IME_SELECT = $0285;

WM_IME_CHAR = $0286;

WM_IME_REQUEST = $0288;

WM_IME_KEYDOWN = $0290;

WM_IME_KEYUP = $0291;

WM_MDICREATE = $0220;

应用E序发送此消息l多文的客L口来创徏一个MDI 子窗?

WM_MDIDESTROY = $0221;

应用E序发送此消息l多文的客L口来关闭一个MDI 子窗?

WM_MDIACTIVATE = $0222;

应用E序发送此消息l多文的客L口通知客户H口Ȁzd一个MDI子窗口,当客L口收到此消息后,它发出WM_MDIACTIVE消息lMDI子窗口(未激z)ȀzdQ?

WM_MDIRESTORE = $0223;

E序 发送此消息lMDI客户H口让子H口从最大最化恢复到原来大?

WM_MDINEXT = $0224;

E序 发送此消息lMDI客户H口ȀzM一个或前一个窗?

WM_MDIMAXIMIZE = $0225;

E序发送此消息lMDI客户H口来最大化一个MDI子窗口;

WM_MDITILE = $0226;

E序 发送此消息lMDI客户H口以^铺方式重新排列所有MDI子窗?

WM_MDICASCADE = $0227;

E序 发送此消息lMDI客户H口以层叠方式重新排列所有MDI子窗?

WM_MDIICONARRANGE = $0228;

E序 发送此消息lMDI客户H口重新排列所有最化的MDI子窗?

WM_MDIGETACTIVE = $0229;

E序 发送此消息lMDI客户H口来找到激zȝ子窗口的句柄

WM_MDISETMENU = $0230;

E序 发送此消息lMDI客户H口用MDI菜单代替子窗口的菜单

WM_ENTERSIZEMOVE = $0231;

WM_EXITSIZEMOVE = $0232;

WM_DROPFILES = $0233;

WM_MDIREFRESHMENU = $0234;

WM_MOUSEHOVER = $02A1;

WM_MOUSELEAVE = $02A3;

WM_CUT = $0300;

E序发送此消息l一个编辑框或combobox来删除当前选择的文?

WM_COPY = $0301;

E序发送此消息l一个编辑框或combobox来复制当前选择的文本到剪脓?

WM_PASTE = $0302;

E序发送此消息leditcontrol或combobox从剪贴板中得到数?

WM_CLEAR = $0303;

E序发送此消息leditcontrol或combobox清除当前选择的内容;

WM_UNDO = $0304;

E序发送此消息leditcontrol或combobox撤消最后一ơ操?

WM_RENDERFORMAT = $0305Q?

WM_RENDERALLFORMATS = $0306;

WM_DESTROYCLIPBOARD = $0307;

当调用ENPTYCLIPBOARD函数?发送此消息l剪贴板的所有?

WM_DRAWCLIPBOARD = $0308;

当剪贴板的内容变化时发送此消息l剪贴板观察铄W一个窗口;它允许用剪脓板观察窗口来

昄剪脓板的新内容;

WM_PAINTCLIPBOARD = $0309;

当剪贴板包含CF_OWNERDIPLAY格式的数据ƈ且剪贴板观察H口的客户区需要重画;

WM_VSCROLLCLIPBOARD = $030A;

WM_SIZECLIPBOARD = $030B;

当剪贴板包含CF_OWNERDIPLAY格式的数据ƈ且剪贴板观察H口的客户区域的大小已经改变是此消息通过剪脓板观察窗口发送给剪脓板的所有者;

WM_ASKCBFORMATNAME = $030C;

通过剪脓板观察窗口发送此消息l剪贴板的所有者来h一个CF_OWNERDISPLAY格式的剪贴板的名?

WM_CHANGECBCHAIN = $030D;

当一个窗口从剪脓板观察链中移L发送此消息l剪贴板观察铄W一个窗口;

WM_HSCROLLCLIPBOARD = $030E;

此消息通过一个剪贴板观察H口发送给剪脓板的所有?Q它发生在当剪脓板包含CFOWNERDISPALY格式的数据ƈ且有个事件在剪脓板观察窗的水qx动条上;所有者应滚动剪脓板图象ƈ更新滚动条的|

WM_QUERYNEWPALETTE = $030F;

此消息发送给要收到焦点的窗口,此消息能使窗口在收到焦点时同时有Z实现他的逻辑调色?

WM_PALETTEISCHANGING= $0310;

当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用E序

WM_PALETTECHANGED = $0311;

此消息在一个拥有焦点的H口实现它的逻辑调色板后发送此消息l所有顶Uƈ重叠的窗口,以此来改变系l调色板

WM_HOTKEY = $0312;

当用h下由REGISTERHOTKEY函数注册的热键时提交此消?

WM_PRINT = 791;

应用E序发送此消息仅当WINDOWS或其它应用程序发Z个请求要求绘制一个应用程序的一部分Q?

WM_PRINTCLIENT = 792;

WM_HANDHELDFIRST = 856;

WM_HANDHELDLAST = 863;

WM_PENWINFIRST = $0380;

WM_PENWINLAST = $038F;

WM_COALESCE_FIRST = $0390;

WM_COALESCE_LAST = $039F;

WM_DDE_FIRST = $03E0;

WM_DDE_INITIATE = WM_DDE_FIRST + 0;

一个DDE客户E序提交此消息开始一个与服务器程序的会话来响应那个指定的E序和主题名Q?

WM_DDE_TERMINATE = WM_DDE_FIRST + 1;

一个DDE应用E序Q无论是客户q是服务器)提交此消息来l止一个会话;

WM_DDE_ADVISE = WM_DDE_FIRST + 2;

一个DDE客户E序提交此消息给一个DDE服务E序来请求服务器每当数据Ҏ变时更新?

WM_DDE_UNADVISE = WM_DDE_FIRST + 3;

一个DDE客户E序通过此消息通知一个DDE服务E序不更新指定的Ҏ一个特D的剪脓板格式的?

WM_DDE_ACK = WM_DDE_FIRST + 4;

此消息通知一个DDEQ动态数据交换)E序已收到ƈ正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息

WM_DDE_DATA = WM_DDE_FIRST + 5;

一个DDE服务E序提交此消息给DDE客户E序来传递个一数据给客户或通知客户的一条可用数据项

WM_DDE_REQUEST = WM_DDE_FIRST + 6;

一个DDE客户E序提交此消息给一个DDE服务E序来请求一个数据项的|

WM_DDE_POKE = WM_DDE_FIRST + 7;

一个DDE客户E序提交此消息给一个DDE服务E序Q客户用此消息来请求服务器接收一个未l同意的数据;服务器通过{复WM_DDE_ACK消息提示是否它接收这个数据项Q?

WM_DDE_EXECUTE = WM_DDE_FIRST + 8;

一个DDE客户E序提交此消息给一个DDE服务E序来发送一个字W串l服务器让它象串行命令一栯处理Q服务器通过提交WM_DDE_ACK消息来作回应Q?

WM_DDE_LAST = WM_DDE_FIRST + 8;

WM_APP = $8000;

WM_USER = $0400;

此消息能帮助应用E序自定义私有消息;

/////////////////////////////////////////////////////////////////////

通知消息(Notification message)是指q样一U消息,一个窗口内的子控g发生了一些事情,需要通知父窗口。通知消息只适用于标准的H口控g如按钮、列表框、组合框、编辑框Q以及Windows 95公共控g如树状视图、列表视囄。例如,单击或双M个控件、在控g中选择部分文本、操作控件的滚动条都会生通知消息?

按扭

B N _ C L I C K E D //用户单击了按?

B N _ D I S A B L E //按钮被禁?

B N _ D O U B L E C L I C K E D //用户双击了按?

B N _ H I L I T E //用户加亮了按?

B N _ PA I N T按钮应当重画

B N _ U N H I L I T E加亮应当L

l合?

C B N _ C L O S E U Pl合框的列表框被关闭

C B N _ D B L C L K用户双击了一个字W串

C B N _ D R O P D O W Nl合框的列表框被拉出

C B N _ E D I T C H A N G E用户修改了编辑框中的文本

C B N _ E D I T U P D AT E~辑框内的文本即更?

C B N _ E R R S PA C El合框内存不?

C B N _ K I L L F O C U Sl合框失去输入焦?

C B N _ S E L C H A N G E在组合框中选择了一?

C B N _ S E L E N D C A N C E L用户的选择应当被取?

C B N _ S E L E N D O K用户的选择是合法的

C B N _ S E T F O C U Sl合框获得输入焦?

~辑?

E N _ C H A N G E~辑框中的文本己更新

E N _ E R R S PA C E~辑框内存不?

E N _ H S C R O L L用户点击了水qx动条

E N _ K I L L F O C U S~辑框正在失去输入焦?

E N _ M A X T E X T插入的内容被截断

E N _ S E T F O C U S~辑框获得输入焦?

E N _ U P D AT E~辑框中的文本将要更?

E N _ V S C R O L L用户点击了垂直滚动条消息含义

列表?

L B N _ D B L C L K用户双击了一?

L B N _ E R R S PA C E列表框内存不?

L B N _ K I L L F O C U S列表框正在失去输入焦?

L B N _ S E L C A N C E L选择被取?

L B N _ S E L C H A N G E选择了另一?

L B N _ S E T F O C U S列表框获得输入焦?



warrior 2006-12-28 16:39 发表评论
]]>
[转]windows消息机制http://www.shnenglu.com/zgysx/archive/2006/12/28/16945.htmlwarriorwarriorThu, 28 Dec 2006 08:36:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/12/28/16945.htmlhttp://www.shnenglu.com/zgysx/comments/16945.htmlhttp://www.shnenglu.com/zgysx/archive/2006/12/28/16945.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/16945.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/16945.html windows消息机制

一 Windows中有一个系l消息队列,对于每一个正在执行的Windows应用E序,pȝ为其建立一个“消息队列”,卛_用程序队列,用来存放该程序可能创建的各种H口的消息。应用程序中含有一D늧作“消息@环”的代码Q用来从消息队列中检索这些消息ƈ把它们分发到相应的窗口函C?/p>

o_windowsmessage2.jpg

?Windows为当前执行的每个WindowsE序l护一个「消息队列」。在发生输入事g之后QWindows事件{换ؓ一个「消息」ƈ消息放入程序的消息队列中。程序通过执行一块称之ؓ「消息@环」的E序代码从消息队列中取出消息Q?br />while(GetMessage (&msg, NULL, 0, 0))       
{        
    TranslateMessage (&msg) ;        
    DispatchMessage (&msg) ;       
}

msg变量是型态ؓMSG的结构,型态MSG在WINUSER.H中定义如下:
typedef struct tagMSG       
{       
    HWND   hwnd ;        
    UINT   message ;        
    WPARAM wParam ;        
    LPARAM lParam ;        
    DWORD  time ;        
    POINT  pt ;       
}       
MSG, * PMSG ;
      
POINT数据型态也是一个结构,它在WINDEF.H中定义如下:
typedef struct tagPOINT       
{       
    LONG  x ;       
    LONG  y ;       
}       
POINT, * PPOINT;
TranslateMessage(&msg); msgl构传给WindowsQ进行一些键盘{换。(关于q一点,我们在W六章中深入讨论。)
DispatchMessage(&msg);又将msgl构回传lWindows。然后,Windows该消息发送给适当的窗口消息处理程序,让它q行处理。这也就是说QWindows呼叫窗口消息处理程序。在HELLOWIN中,q个H口消息处理E序是WndProc函数。处理完消息之后QWndProc传回到Windows。此ӞWindowsq停留在DispatchMessage呼叫中。在l束DispatchMessage呼叫的处理之后,Windows回到HELLOWINE序中,q且接着从下一个GetMessage呼叫开始消息@环?br />        
?队列化消息与非队列化消息
    
消息能够被分为「队列化的」和「非队列化的」。队列化的消息是由Windows攑օE序消息队列中的。在E序的消息@环中Q重C回ƈ分配l窗口消息处理程序。非队列化的消息在Windows呼叫H口时直接送给H口消息处理E序。也是_队列化的消息被「发送」给消息队列Q而非队列化的消息则「发送」给H口消息处理E序。Q何情况下Q窗口消息处理程序都获得窗口所有的消息--包括队列化的和非队列化的。窗口消息处理程序是H口的「消息中心」?/p>

队列化消息基本上是用者输入的l果Q以击键Q如WM_KEYDOWN和WM_KEYUP消息Q、击键生的字符QWM_CHARQ、鼠标移动(WM_MOUSEMOVEQ和鼠标按钮QWM_LBUTTONDOWNQ的形式l出。队列化消息q包含时钟消息(WM_TIMERQ、更新消息(WM_PAINTQ和退出消息(WM_QUITQ?/p>

非队列化消息则是其它消息。在许多情况下,非队列化消息来自呼叫特定的Windows函数。例如,当WinMain呼叫CreateWindowӞWindows徏立窗口ƈ在处理中l窗口消息处理程序发送一个WM_CREATE消息。当WinMain呼叫ShowWindowӞWindows给H口消息处理E序发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain呼叫UpdateWindowӞWindows给H口消息处理E序发送WM_PAINT消息。键盘或鼠标输入时发出的队列化消息信P也能在非队列化消息中出现。例如,用键盘或鼠标选择了一个菜单项Ӟ键盘或鼠标消息就是队列化的,而说明菜单项已选中的WM_COMMAND消息则可能就是非队列化的?/p>

?SendMessage()与PostMessage()之间的区别是什么?
它们两者是用于向应用程序发送消息的。PostMessagex()消息直接加入到应用E序的消息队列中Q不{程序返回就退出;而SendMessage()则刚好相反,应用E序处理完此消息后,它才q回。我想下图能够比较好的体现这两个函数的关p:

o_postmessage.gif


?函数peekmessage和getmessage的区别?

两个函数主要有以下两个区?
1.GetMessage等到有合适的消息时才q回,而PeekMessage只是撇一下消息队列?br />2.GetMessage会将消息从队列中删除,而PeekMessage可以讄最后一个参数wRemoveMsg来决定是否将消息保留在队列中?/p>



warrior 2006-12-28 16:36 发表评论
]]>
止E序多开,q将原程序带到前?/title><link>http://www.shnenglu.com/zgysx/archive/2006/12/15/16483.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Fri, 15 Dec 2006 08:18:00 GMT</pubDate><guid>http://www.shnenglu.com/zgysx/archive/2006/12/15/16483.html</guid><wfw:comment>http://www.shnenglu.com/zgysx/comments/16483.html</wfw:comment><comments>http://www.shnenglu.com/zgysx/archive/2006/12/15/16483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zgysx/comments/commentRss/16483.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zgysx/services/trackbacks/16483.html</trackback:ping><description><![CDATA[ <p>CString strMutexName = "MySingleInstance"; <br />HANDLE hMutex = CreateMutex(NULL,FALSE,strMutexName);  <br /> if (  hMutex )<br /> {<br />  if ( ERROR_ALREADY_EXISTS == ::GetLastError() )<br />  {//如果已有先前的实?则退?br />    <br />      HWND hWnd= ::FindWindow([E序H口cd], [E序H口名称]);<br />      if( hWnd)<br />      {<br />       ::ShowWindow( hWnd, SW_SHOWNORMAL);<br />       ::SetForegroundWindow( hWnd);<br />       ::BringWindowToTop( hWnd);<br />       ::FlashWindow( hWnd, TRUE );<br />      }<br />      exit(0);<br />   }<br />}</p> <img src ="http://www.shnenglu.com/zgysx/aggbug/16483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zgysx/" target="_blank">warrior</a> 2006-12-15 16:18 <a href="http://www.shnenglu.com/zgysx/archive/2006/12/15/16483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打开文g对话框与目录选择对话?/title><link>http://www.shnenglu.com/zgysx/archive/2006/12/06/16053.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Wed, 06 Dec 2006 08:17:00 GMT</pubDate><guid>http://www.shnenglu.com/zgysx/archive/2006/12/06/16053.html</guid><wfw:comment>http://www.shnenglu.com/zgysx/comments/16053.html</wfw:comment><comments>http://www.shnenglu.com/zgysx/archive/2006/12/06/16053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zgysx/comments/commentRss/16053.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zgysx/services/trackbacks/16053.html</trackback:ping><description><![CDATA[ <p> <font color="#ff0000">打开文g对话?br /></font>const char pszFilter[] = _T("EXE File (*.txt)|*.txt|All Files (*.*)|*.*||");<br />CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,<br />  pszFilter, this);<br /><br />dlg.m_ofn.lpstrInitialDir = "c:\\WINDOWS\\";  //讄对话框默认呈现的路径<br /><br />if(dlg.DoModal() == IDOK)<br />{<br />CString strFilePath = dlg.GetPathName();<br />/*如果有多个文??br />for(POSITION pos = dlg.GetStartPosition(); pos!=NULL; )<br />  {<br />   CString strFilePathName = dlg.GetNextPathName(pos);<br />*/<br />}</p> <p> <font color="#ff0000">保存文g对话?br /></font>const char pszFilter[] = _T("EXE Files (*.txt)|*.txt||");<br />CFileDialog dlgSave( FALSE,   //FALSEZ?br />  _T(".txt"), //自动加上的扩展名<br />  _T("Output.txt"),  //默认保存的文件名<br />  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,<br />  pszFilter, this);<br /><br /><br /><br /><font style="BACKGROUND-COLOR: #ffffff" color="#ffff00"><font color="#ff0000">目录选择对话?/font><br /></font><br /> BROWSEINFO bi;<br /> char szPathName[MAX_PATH];<br /> char szTitle[] = "选择路径";<br /> ZeroMemory(&bi, sizeof(BROWSEINFO));<br /> <br /> bi.hwndOwner = GetSafeHwnd();<br /> bi.pszDisplayName = szPathName;<br /> bi.lpszTitle = szTitle;<br /> bi.ulFlags = 0x0040 ; <br /> CString str;<br />CString strDir;  //选择的目?/p> <p> LPITEMIDLIST idl = SHBrowseForFolder(&bi);<br /> if(idl == NULL)<br /> {<br />  strDir= "";<br />  return;<br /> }<br /> <br /> SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH * 2));<br /> str.ReleaseBuffer();<br /> if(str != "" && str.GetAt(str.GetLength() - 1) != '\\')<br />  str += "\\";<br /> strDir = str;<br /></p> <img src ="http://www.shnenglu.com/zgysx/aggbug/16053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zgysx/" target="_blank">warrior</a> 2006-12-06 16:17 <a href="http://www.shnenglu.com/zgysx/archive/2006/12/06/16053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在对话框上以路径形式昄字符?当字W串长度q长?中间的字W串用省略号代替)http://www.shnenglu.com/zgysx/archive/2006/12/06/16052.htmlwarriorwarriorWed, 06 Dec 2006 08:13:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/12/06/16052.htmlhttp://www.shnenglu.com/zgysx/comments/16052.htmlhttp://www.shnenglu.com/zgysx/archive/2006/12/06/16052.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/16052.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/16052.html在对话框上以路径形式昄字符?当字W串长度q长?中间的字W串用省略号代替)

CPaintDC dc(this);
CFont NewFont, * pOldFont;
NewFont.CreatePointFont(90, _T("宋体"), NULL);
pOldFont = dc.SelectObject(&NewFont);
dc.SetBkMode(TRANSPARENT);

CRect rect;
//IDC_STATIC_PATH是显C字W串的static控g的ID, 注意控g的要设ؓ不可?br />GetDlgItem(IDC_STATIC_PATH)->GetWindowRect(rect);
ScreenToClient(rect);

dc.DrawText(m_strCorePath, -1, rect, DT_LEFT | DT_PATH_ELLIPSIS | DT_VCENTER | DT_SINGLELINE);
dc.SelectObject(pOldFont);



warrior 2006-12-06 16:13 发表评论
]]>
使窗口透明http://www.shnenglu.com/zgysx/archive/2006/11/07/14808.htmlwarriorwarriorTue, 07 Nov 2006 10:16:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/11/07/14808.htmlhttp://www.shnenglu.com/zgysx/comments/14808.htmlhttp://www.shnenglu.com/zgysx/archive/2006/11/07/14808.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/14808.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/14808.html#define LWA_COLORKEY 0x00000001  // Use color as the transparency color.
#define WS_EX_LAYERED 0x00080000
#define LWA_ALPHA 2   // Use bAlpha to determine the opacity of the layer
typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
lpfnSetLayeredWindowAttributes MySetLayeredWindowAttributes;

H口半透明
HMODULE hUser32 = GetModuleHandle("user32.dll");
MySetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,"SetLayeredWindowAttributes");
if(MySetLayeredWindowAttributes == NULL)
{
 AfxMessageBox("载入pȝdllp|,E序卛_退?");
 exit(0);
}

::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) ^ WS_EX_LAYERED);
MySetLayeredWindowAttributes(GetSafeHwnd(), 0,
 130, //q个参数是控制窗口透明的层? ?时窗口全透明,包括标题? ?55?不透明
 LWA_ALPHA);//LWA_COLORKEY
FreeLibrary(hUser32);


使对话框H口的客户区全透明
COLORREF maskColor= 14215660; q是颜色掩码,与这个颜色相同的不被显C出?br />SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
MySetLayeredWindowAttributes(GetSafeHwnd(), maskColor, 10, LWA_COLORKEY);


 



warrior 2006-11-07 18:16 发表评论
]]>
VC 中用自定义资源http://www.shnenglu.com/zgysx/archive/2006/10/31/14419.htmlwarriorwarriorTue, 31 Oct 2006 04:10:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/10/31/14419.htmlhttp://www.shnenglu.com/zgysx/comments/14419.htmlhttp://www.shnenglu.com/zgysx/archive/2006/10/31/14419.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/14419.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/14419.html举例: 一个文件做源导入到VC工程?.rc文g?E序q行时再资源释攑և来写到文件中?

bool DeliverResource(const CString& strDestPath, const char * pszID, const char * pszType)
{
 HRSRC hRsrc = FindResource(NULL, pszID, pszType);
 if(NULL == hRsrc)
  return false;
 DWORD dwSize = SizeofResource(NULL, hRsrc);
 if(0 == dwSize)
  return false;
 HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
 if(NULL == hGlobal)
  return false;
 LPVOID pBuffer = LockResource(hGlobal);
 if(NULL == pBuffer)
  return false;

 tool::CreateMidDir(strDestPath);
 FILE *fp = fopen(strDestPath, "wb");
 DWORD dwRemain = dwSize;
 while(dwRemain > 0)
 {
  dwRemain -= fwrite(pBuffer, sizeof(char), dwRemain, fp);
 }
 fclose(fp);
 return true;
}



warrior 2006-10-31 12:10 发表评论
]]>
Windows 内存映射文g的?/title><link>http://www.shnenglu.com/zgysx/archive/2006/10/31/14414.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Tue, 31 Oct 2006 03:35:00 GMT</pubDate><guid>http://www.shnenglu.com/zgysx/archive/2006/10/31/14414.html</guid><wfw:comment>http://www.shnenglu.com/zgysx/comments/14414.html</wfw:comment><comments>http://www.shnenglu.com/zgysx/archive/2006/10/31/14414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zgysx/comments/commentRss/14414.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zgysx/services/trackbacks/14414.html</trackback:ping><description><![CDATA[ <p>举例:像操作字W串一样地操作一个文件中的内?br /><br /><br />bool OperateFileJustLikeToString(const char * pszFileName)<br />{<br /> const HANDLE hFile = CreateFile(pszFileName, \<br />  GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, \<br />  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);<br /> if(hFile == INVALID_HANDLE_VALUE)<br />  return false;</p> <p> DWORD dwLength = GetFileSize(hFile, NULL);<br /> //创徏内存映射对象,内存映射文g的大?= 文g长度 + (WCHAR)'\0'<br /> //因ؓ我们要在文g的末֊上一个字W串的结束符'\0', 当我们将q个文g映射到内存中?我们可以像操作字符串一样地来操作文件了<br /> const HANDLE hFileMap = CreateFileMapping(<br />  hFile, NULL, PAGE_READWRITE, 0, <br />  dwLength + sizeof(WCHAR), <br />  NULL);<br /> <br /> char * pFile = (char *)MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);<br /> pFile[dwLength / sizeof(char)] = '\0';<br /> <br /> //现在Ҏ件的操作变成了对一字符串pFile的操作了,所有的字符串函数都?br /> //对pFileq个字符串进行操? 而操作的l果则会被保存到文g中去(但是q不<br />是改变pFile<br /> //中的内容后会立刻写到文g中去,但是在调用UnmapViewOfFile()?保证先前对pFile的修改全部保存到文g中了)<br /> //...........<br /> //statement();<br /> //............</p> <p> UnmapViewOfFile(pFile);<br /> CloseHandle(hFileMap);</p> <p> //我们改变了文件的长度,因此要重新设|文件的l束W以删除留在文gN的多余内?比如删除我们先前加到文g末尾?\0'字符)<br /> SetFilePointer(hFile,dwLength , NULL, FILE_BEGIN);<br /> SetEndOfFile(hFile);  //讑֮当前文g指针所在处为文件结束处.该处后面的内容将被删?br /> CloseHandle(hFile);<br /> return true;<br />}</p> <img src ="http://www.shnenglu.com/zgysx/aggbug/14414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zgysx/" target="_blank">warrior</a> 2006-10-31 11:35 <a href="http://www.shnenglu.com/zgysx/archive/2006/10/31/14414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使程序界面具有XP风格(在VS2003和VS2005?http://www.shnenglu.com/zgysx/archive/2006/10/31/14413.htmlwarriorwarriorTue, 31 Oct 2006 02:52:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/10/31/14413.htmlhttp://www.shnenglu.com/zgysx/comments/14413.htmlhttp://www.shnenglu.com/zgysx/archive/2006/10/31/14413.html#Feedback4http://www.shnenglu.com/zgysx/comments/commentRss/14413.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/14413.html 在VS 2003 环境?br />1.在工E的目录下徏一个名?xpapp.manifest的文? 把下面的内容拷到q个文g?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="Microsoft.Windows.ViPod"
    type="win32"
/>
<description>Your app description here</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>


2.工E的*.rc文g打开, 加上q样一句话(注意要加?endif?:

//q名话是告诉工程使用刚才我们创徏的那个文?使程序界面变成XP风格
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "xpapp.manifest"


3.在工E的C*App文g中加?br />#pragma comment(lib, "ComCtl32.lib")      //3步是选做

4.如果你的代码是用V6的向导生成的,那必d工程转成vc.net?然后在C*App的InitInstance()最开始出加上
InitCommonControls();q个函数,V6的向g会自动添加这个函?
//4步是选做


如果是VS 2005 则有所不同
VS 2005?如果Project->Property  -- General -- Character Set 为Use Unicode Character Set,那么E序的界面自然就是XP风格,不需要手动添加Q何东ѝ但是如果这里是Use Multi-Byte Character SetQ那么就要自己动手加东西了,和上面操作差不多?br />
1、徏一个名为XPStyle.manifest的文?br />2、把下面的内Ҏ到这个文件中
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
      version="1.0.0.0"
      processorArchitecture="X86"
      name="Microsoft.Windows.WorkSapceName"
      type="win32"
/>
  <description>Your app description here</description>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="X86"
          publicKeyToken="6595b64144ccf1df"
          language="*"
        />
    </dependentAssembly>
  </dependency>
</assembly>

3、Project->Add Existing Item...XPStyle.manifestd到工E中?br />
4、打开工程中的Resource.h文gQ加上:
#define IDR_MANIFEST  1
#define RT_MANIFEST 24


5、将工程的res\*.rc2文g打开, 加上:
// Add manually edited resources here...
IDR_MANIFEST RT_MANIFEST MOVEABLE PURE   "res\\XPStyle.manifest"


6、Rebuild.....可以了?br />(源自:http://blog.csdn.net/limigy/archive/2006/04/04/650008.aspx)



warrior 2006-10-31 10:52 发表评论
]]>
使用键盘钩子(不用DLL)http://www.shnenglu.com/zgysx/archive/2006/10/30/14376.htmlwarriorwarriorMon, 30 Oct 2006 06:10:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/10/30/14376.htmlhttp://www.shnenglu.com/zgysx/comments/14376.htmlhttp://www.shnenglu.com/zgysx/archive/2006/10/30/14376.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/14376.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/14376.html#define WH_KEYBOARD_LL     13

定义一个钩子函?br />LRESULT CALLBACK HookFun(int nCode, WPARAM wParam, LPARAM lParam);

HHOOK g_hHook = NULL;

首先要安装钩?br />g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, HookFun, GetModuleHandle(NULL), NULL);
if(g_hHook == NULL)
 AfxMessageBox("hook failure!");


在程序结束时要卸载钩?br />UnhookWindowsHookEx(g_hHook);

钩子函数的实?br />LRESULT CALLBACK HookFun(int nCode, WPARAM wParam, LPARAM lParam)
{
  CWPSTRUCT* p = (CWPSTRUCT*) lParam;
 if (nCode == HC_ACTION)
 { 
  switch (wParam) //wParam中是消息ID
  { 
  case WM_KEYDOWN: 
   {  
      if(p->lParam == 'l' || p->lParam == 'L') 
      {
           // 'l' 键被按下 
            //do somthing
       }
    
    if(p->lParam == VK_ESCAPE)
    {//用户按下了Esc
      //do somthing
    }  
  } 
 }
 return CallNextHookEx(NULL, nCode, wParam, lParam);
}



warrior 2006-10-30 14:10 发表评论
]]>
Windows中用鼠标拖放文ghttp://www.shnenglu.com/zgysx/archive/2006/10/19/13851.htmlwarriorwarriorThu, 19 Oct 2006 00:47:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/10/19/13851.htmlhttp://www.shnenglu.com/zgysx/comments/13851.htmlhttp://www.shnenglu.com/zgysx/archive/2006/10/19/13851.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/13851.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/13851.htmld对WM_DROPFILES响应的函?br />void CMyDlg::OnDropFiles(HDROP hDropInfo)
{
 char szFilePath[MAX_PATH];
 int nFileCount;
//取得拖放的文件个?br /> nFileCount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, MAX_PATH);

 //获取拖放的文件\?br /> UINT nCharNum = DragQueryFile(hDropInfo, 0, szFilePath, MAX_PATH);
 //szFilePath中保存着文g路径或者一个目?br />//doSomething();
 
 DragFinish(hDropInfo);
 CDialog::OnDropFiles(hDropInfo);
}



warrior 2006-10-19 08:47 发表评论
]]>
E序中显CZ隐示的调?dllhttp://www.shnenglu.com/zgysx/archive/2006/10/13/13619.htmlwarriorwarriorFri, 13 Oct 2006 00:39:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/10/13/13619.htmlhttp://www.shnenglu.com/zgysx/comments/13619.htmlhttp://www.shnenglu.com/zgysx/archive/2006/10/13/13619.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/13619.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/13619.html//===================================
//MyAlg.h
//===================================
/*
隐示装蝲的dll

从dll中导Z个类,  使用q个dll中类的可执行代码工程必须和这个dll工程用的是同一~译?br />否则q个dll不可用
*/

class CMyAlg
{
public:
 __declspec(dllimport) int Add(int a, int b);
};


//===================================
//MyAlg.cpp
//===================================
#include "MyAlg.h"
int CMyAlg::Add(int a, int b)
{
 return (a + b);
}





//===================================
//alg.h
//===================================

/*
昄装蝲的dll

从dll中导Z人函数和一个变? q个不会出现像导出类所到的问? 要以C
风格的型式导?br />*/
extern "C" __declspec(dllimport) int Add(int a, int b);
extern "C" __declspec(dllimport) int g_nValue;







//===================================
//test.cpp  试前面写好的dll
//===================================

#include <stdio.h>

#define   EXPLICIT_LOAD

#ifdef EXPLICIT_LOAD //定义了显C方法加载DLL
#include <windows.h>
#endif

#ifdef IMPLICIT_LOAD //定义了隐C方法加载DLL
#include "MyAlg.h"
#include "alg.h"
#pragma comment(lib, "Class.lib") //dll中导Z个类
#pragma comment(lib, "Win32Dll.lib")//dll中导Z个函数和变量
#endif


void main(void)
{
#ifdef IMPLICIT_LOAD
//使用隐示Ҏ加蝲DLL,可以调用dll中导出的函数、变量和c?br /> CMyAlg alg;
 printf("使用隐示Ҏ加蝲DLL\n");
 printf("CMyAlg::Add(%d, %d) = %d, \n", 1, 2, alg.Add(1, + 2));
 printf("Add(%d, %d) = %d, g_nValue = %d\n\n", 1, 2, Add(1, 2), g_nValue);
#endif


#ifdef EXPLICIT_LOAD 
//使用昄的方法加载DLLQ只能调用dll中以C风格导出的函?br /> printf("使用昄的方法加载DLL\n");
 HINSTANCE hIns = LoadLibrary("Win32Dll.dll");
 if(hIns = NULL)
 {
  printf("Load dll failure!\n");
  return;
 }
 
 typedef int(* pAdd)(int, int);
 pAdd pfun = (pAdd)GetProcAddress(hIns, "Add");
 printf("pfun(1, 2) = %d, pfun(1,2)\n");

 FreeLibrary(hIns);
#endif

 getchar();
}



warrior 2006-10-13 08:39 发表评论
]]>
获取pȝ当前旉http://www.shnenglu.com/zgysx/archive/2006/10/09/13475.htmlwarriorwarriorMon, 09 Oct 2006 01:10:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/10/09/13475.htmlhttp://www.shnenglu.com/zgysx/comments/13475.htmlhttp://www.shnenglu.com/zgysx/archive/2006/10/09/13475.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/13475.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/13475.html time(&ltime);
 char t[50];
 strftime(t, 50, "%Y%m%d%H%M%S\0", localtime(&ltime));

warrior 2006-10-09 09:10 发表评论
]]>
þݺҹҹavapp | þ| Ʒþþ| þĻƷһ| þAV뾫Ʒ| ˾þô߽ۺĻ| ޹ƷۺϾþ| þþƷëƬѹۿ| þþƷһ| 㽶þavһ| ݺɫۺվþþþþþ| AëƬþþƷ| ƷŮþþ| vaĻþò| þþþþྫƷֱ| þþþþ޾Ʒ| þֻ⾫Ʒ99| ҹƷƬþ| þþһ| þøԴƷ999| 99þҹɫƷվ| ƷVAþþþþþñ| 18ƾþþAAAƬ| þAV| ˾þ91| þɧ| þĻ| ޾ƷƵþþ| þ̳| ƷŮþþþAV| ˾þۺ| 99þþþƷѹۿ| þۺϸϾþúݺݺ97ɫ | ƷþƷ| avھƷþþþӰԺ| ٸ88þĻ| 99Ʒþþþþþ| þþƷƷ޾Ʒ| Ʒþþþþþþ| Ʒ˾þþ| 69ƷþþþAPP|