以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- VC编程常用捷径 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=50151) |
-- 作者:一分之千 -- 发布时间:7/18/2007 11:02:00 AM -- VC编程常用捷径 1. 如何获取应用程序的 实例句柄? 应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用 AfxGetInstancdHandle获得句柄. Example: HANDLE hInstance=AfxGetInstanceHandle(); 2. 如何通过代码获得应用程序主窗口的 指针? 3.如何在程序中获得其他程序的 图标? void CSampleView: OnDraw(CDC * pDC) void CSampleView:: OnDraw(CDC *pDC) if (hIcon &&hIcon!=(HICON)-1) 4.如何编程结束应用程序?如何编程控制windows的重新引导? 还可以创建一个自定义的函数 Terminate Window void Terminate Window(LPCSTR pCaption) 说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如 第二问,Use ExitWindowsEx Function函数控制系统是重新引导,还是重启 windows. 5.怎样加栽其他的应用程序? CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以 CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_ 6. 确定应用程序的 路径 7. 获得各种目录信息 8. 如何自定义消息 //加入你的处理函数
|
-- 作者:一分之千 -- 发布时间:7/18/2007 11:04:00 AM -- 9. 如何改变窗口的 图标? 向窗口发送 WM_SECTION消息。 Example: HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon); 10. 如何改变窗口的 缺省风格? BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs) return CMDIFramewnd ::PreCreateWindow(cs); } 11. 如何将窗口居中显示? Example(1): Center Window( ); //Relative to it's parent 12. 如何让窗口和 MDI窗口一启动就最大化和最小化? MDI窗口: 13. 如何使程序保持极小状态? 14. 如何限制窗口的 大小? 15. 如何使窗口不可见? 16. 如何使窗口始终在最前方? Example:
|
-- 作者:一分之千 -- 发布时间:7/18/2007 11:06:00 AM -- 17、如何创建一个字回绕的CEditView 重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象 的ES_AUTOHSCROLL和WS_HSCROLL风格位, 由于CEditView : : PreCreateWindow显示 设置cs. style,调用基类函数后要修改cs . style。 BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs) { //First call basse class function . BOOL bResutl =CEditView : : PreCreateWindow (cs) ; // Now specify the new window style . 18、通用控件的显示窗口 MFC提供了几个CView派生的视窗类, 封装了通用控件的功能,但仍然使用工 19、移动窗口 20、重置窗口的大小 调用CWnd: : SetWindowPos并指定SWP_NOMOVE标志, 也可调用 //Make the window twice as wide and twice as tall . 当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理 void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point ) 22、如何改变视窗的背景颜色 Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用 BOOL CSampleView : : OnEraseBkgnd (CDC* pDC) // Select the brush into the device context . // Get the area that needs to be erased . //Paint the area. //Unselect brush out of device context . // Return nonzero to half fruther processing . 23、如何改变窗口标题 调用CWnd : : SetWindowText可以改变任何窗口(包括控件)的标题。 //Set title for View's MDI child frame window . //Set title for dialog's push button control. 24、如何防止主框窗口在其说明中显示活动的文档名 创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位, 如果不希望在 25、如何获取有关窗口正在处理的当前消息的信息 CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。 25、如何获取有关窗口正在处理的当前消息的信息 |
-- 作者:一分之千 -- 发布时间:7/18/2007 11:07:00 AM -- 26、如何创建一个不规则形状的窗口 可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一 // Create region and assign to window . return TRUE ; //get the RGB colour components of the sphere color // get the size of the view window // get minimun number of units //calculate he horiaontal and vertical step size int nEllipse = nUnits/3; // calculate how many to draw CBrush brush ; // bursh used for ellipse fill color //draw ellipse , gradually moving towards upper-right corner //draw ellipse //delete the brush 最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。 缺省时, 工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条 //Get pointer to toolbar . 如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止 DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) ; if (bDisplayTips) m_wndToolBar.SetBarStyle (dwStyle ); 工具条是一个窗口,所以可以在调用CWnd : : SetWindowText来设置标题, … MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几 //Call DestroyWindow instead of EndDialog . void CSampleDialog : : OnCancel ( ) //Create the modeless dialog .
|
-- 作者:一分之千 -- 发布时间:7/18/2007 11:10:00 AM -- 31、如何在对话框中显示一个位图 这要归功于Win 32先进的静态控件和Microsoft的资源编辑器, 在对话框中 调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第 //use blue dialog with yellow text . … private : … return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor ); 有两种方法。其一,调用CWnd: : GetDlgItem,获取一个CWnd*指针调用成 //Get pointer to spin button . return TRUE ; 控件也是窗口,所以可以调用CWnd : : EnableWindow使能和禁止控件。 35、如何改变控件的字体 由于控件是也是窗口,用户可以调用CWnd: : SetFont指定新字体。该函数用 … //Create an 8-point Arial font //Set font for push button . … 36、如何在OLE控件中使用OLE_COLOR数据类型 诸如COleControl : : GetFortColor和COleControl : : GetBacalog : : EndDialog 来中止,无模式对话则是调用 //Call DestroyWindow instead of EndDialog . void CSampleDialog : : OnCancel ( ) //Create the modeless dialog . 38、如何确定Windows和Windows系统目录 |
-- 作者:一分之千 -- 发布时间:7/18/2007 11:12:00 AM -- 41、如何一个创建三态下压按钮 可以使用新的BS_PUSHBUTTON 风格位和检测框以及按钮来创建一个三态下 42、如何动态创建控件 分配一个控件对象的实例并调用其Create成员函数。开发者最容易忽略两件 //In class implementation (.cpp file ) . 43、如何限制编辑框中的准许字符 如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指 //In your dialog class declaration (.H file ) //In you dialog class implementation (.CPP file ) //Subclass the edit lontrod . … //Bypass default OnChar processing and directly call 44、如何改变控件的颜色 有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC4.0新的消息反 //Draw red text for all edit controls . return hbr ; private; return (HBRUSH) m_brush.GetSafeHandle () 45、当向列表框中添加多个项时如何防止闪烁 调用CWnd::SetRedraw 清除重画标志可以禁止CListBox(或者窗口)重画。 //Disable redrawing. //Fill in the list box gere //Enable drwing and make sure list box is redrawn. 46、如何向编辑控件中添加文本 由于没有CEdit:: AppendText函数,用户只好自己做此项工作。调用 void CMyEdit:: AppendText (LPCSTR pText) int nLen=GetWindowTextLength (); ReplaceSel (pText); 47、如何访问预定义的GDI对象 可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象,诸 //Use stock black pen and stock gray brush to draw ellipse. //Use background color for tooltips brush. //Draw the ellipse. //Restore original brush. 可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到 //Return the size of a bitmap. //Create a pen with the same color as a brush. 49、如何实现一个橡皮区矩形 CRectTracker是一个很有用的类,可以通过调用CRectTracker:: TrackRubberBand … public : … 其次,在文档类的构造函数中初始化CRectTracker 对象: //Select blue brush into device context. //draw ellipse in tracking rectangle. //Draw tracking rectangle. void CSampleView::OnLButtonDown (UINT nFlags, CPoint point) //If clicked on ellipse, drag or resize it. Otherwise create a //Tracker rectangle changed so update views. else CView:: onLButtonDown (nFlags,point); 50、如何更新翻转背景颜色的文本 调用CDC:: SetBkmode并传送OPAQUE用当前的背景颜色填充背景,或者调用 void CSampleView:: OnDraw (CDC* pDC) //Create sample string to display. //Draw black shadow text. //Draw red text. } 可以指定字体逻辑单位的大小,但有时指定字体的点的大小可能会更方便一 int nHeigth=mulDiv (nPointSize, -dc.GetDeviceCaps (LOGPIXELSY), 72); CClientDC dc (AqfxGetMainWnd ()); m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY), ... LRESULT CMyButton:: OnSettext (WPARAM wParam, LPARAM lParam) //Select current font into device context. //Calculate size of title. //Adjust the button's size based on its title. return bResult; 53、如何显示旋转文本 只要用户使用TrueType或者GDI笔或字体就可以显示旋转文本(有些硬件设备也 //Create sample string. CFont font; //font object //Draw text at 15degree intervals. //Create and select font into dc. //Draw the text. 54、如何正确显示包含标签字符的串 调用GDI文本绘画函数时需要展开标签字符,这可以通过调用 CString str; 55、串太长时如何在其末尾显示一个省略号 调用CDC:: DrawText并指定DT_END_ELLIPSIS标志,这样就可以用小略号取 void CSampleView:: OnDraw (CDC* pDC) //Add ellpsis to middle of string if it does not fit 56、如何快速地格式化一个CString对象 调用CString:: Format,该函数和printf函数具有相同的参数,下例说明了 //Get size of window. 57、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员 //Disable MFC from automatically disabling menu items. //Now enable the menu item. pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED); 58、如何给系统菜单添加一个菜单项 给系统菜单添加一个菜单项需要进行下述三个步骤: int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct) //Make sure system menu item is in the right range. //Get pointer to system menu. … void CMainFrame:: OnSysCommand (UINT nID,LPARAM lParam) else 59、如何确定顶层菜单所占据的菜单行数 这可以通过简单的减法和除法来实现。首先,用户需要计算主框窗口的高 int CMainFrame:: GetMenuRows () 60、在用户环境中如何确定系统显示元素的颜色 调用SDK函数GetSysColor可以获取一个特定显示元素的颜色。下例说明了如何 void CMiniFrameWnd:: OnNcPaint () 60、在用户环境中如何确定系统显示元素的颜色 调用SDK函数GetSysColor可以获取一个特定显示元素的颜色。下例说明了如何 void CMiniFrameWnd:: OnNcPaint () 在Windows 3.1 SDK中介绍过SDK函数SystemParametersInfo,调用该函数可 //Create a font that is used for icon titles. //Change the wallpaper to leaves.bmp. 62、如何使用一个预定义的Windows光标 调用CWinApp:: LoadStandardCursor并传送光标标识符。 return CDialog:: OnSetCursor (pWnd. nHitTest,message); 63、如何确定当前屏幕分辨率 调用SDK函数GetSystemMetrics,该函数可以检索有关windows显示信息,诸如 //Initialize CSize object with screen size. 64、如何检索原先的Task Manager应用程序使用的任务列表 原先的Task Manager应用程序显示顶层窗口的列表。为了显示该列表,窗口 void GetTadkList (CListBox&list) list.ResetContent (); //Clear list box. //Get first Window in window list. //Walk window list. 65、如何确定Windows和Windows系统目录 有两个SDK函数可以完成该功能。GetWindowsDirectory和GetSystemDirectory, TCHAR szDir [MAX_PATH]; 66、在哪儿创建临文件 调用SDK函数GetTemPath可以确定临时文件的目录,该函数首先为临时路径 TRY //write data CATCH (CFileException, e) Void GetuniqueTempName (CString& strTempName) //Create a unique temporary file. strTempName=szTempFile; 67、如何访问桌面窗口 void CFrameWnd::BeginModalState () //first count all windows that need to be disabled 68. 怎样把内存释放干净
C语言的一个好的特性也是坏的特性是它有一个指针类型.由于指针的存在,一些 小的编程失误常会导致内存释放得不干净,或者同一个地址释放两次.ANSI C的模块特 性不如C++强,因此在ANSI C中比C++更容易产生这样的问题.对ANSI C的解决方法就是 加强其模块的内聚度,减少模块间的耦合度,使得指针的应用限制在模块内或一些特殊 的接口上,将它的可维护性向C++靠拢. 根据C++的结构特性,它的指针使用具有很多规律可循.看下面的一个例子: class CTestDialog: public CDialog { private: CMyRecordSet *m_table; public: CTestDialog(); ~CTestDialog();
InitialDialog(); OnOk(); 1.在CTestDialog中应该作 m_table=NULL;ialogalDialog 2.在InitalDialog里作 ASSERT(m_table==NULL);m_table=new CMyRecordSet; 3.在OnOk里作 m_table->Update(); 4.在~CTestDialog中作 if(m_table){delete m_table;m_table=NULL;}
第1步的目的是防止在4步中delete一个并未初始化的指针(因为可能初始化不成功 而不调InitialDialog反而调~CTestDialog,但显然m_table并没有初始化:这里有一个 问题是用惯了UNIX的用户以为m_table是NULL,实际上WIN里面根本没有这个置初值的 习惯,即使有这个约定,我们难到能保证到另一个操作系统,另一套C++中还是如此约定?)
第2步只是既于可能要显示m_table中的数据,在这时作初始化可能比较好,当然也 可以放到CTestDialog中,只要能运行正常.
第3步是一个标准操作而已.
第4步释放内存.判m_table为NULL是避免没有InitalDialog成功,也是为了防止 二次释放.m_table=NULL在~CTestDialog中显得不是很有意义.如果释放操作移到OnOk里就有作用了.
这个例子只说明了在使用指针的过程中要注意的几个问题
注意指针的初值,最好是在初始化类时就附上. 在类的生存期即将结束时,注意将其包含的指针逐个判别释放.
比较容易想到的是在给指针重新附有效值时,最好要加一句 ASSERT(m_table==NULL); 这样不会丢失内存.(条件是在delete m_table后立即执行m_table=NULL)
这里主要讲的是全局指针问题.对于函数内的指针,只要细心,入口处new, 出口处delete,不会有什么内存的问题;唯一比较难缠的是一些比较复杂的数据结构 操作,指针附过来附过去,也就没有什么好的规律可言,全靠技术了.
|
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
7,796.875ms |