工作问题积累(十八)VC界面编程总结
来源:互联网 发布:刘亦菲牙齿知乎 编辑:程序博客网 时间:2024/06/06 06:47
一、改变视图背景色:
在CView的OnDraw函数中添写如下一段程序代码:
void CFileNameView::OnDraw(CDC* pDC) { CFileNameDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect rectClient; CBrush brushBkColor; GetClientRect(rectClient); brushBkColor.CreateSolidBrush(RGB(255,0,0)); //颜色设置 pDC->DPtoLP(rectClient); pDC->FillRect(rectClient,&brushBkColor); … }
二、往基于对话框的程序添加菜单:
[1] 先添加菜单(IDR_MENU1)资源,并加上需要的菜单项。
[2] 编辑对话框资源IDD_DLGMENUTOOLBAR_DIALOG的属性,在属性对话框中选择IDR_MENU1即可。
[3] 假如您不希望在对话框属性中直接设置菜单,而通过代码在程序中动态生成可以采用如下方法:
在CFileNameDlg类声名中添加成员变量CMenu m_menu,再在CFileNameDlg::OnInitDialog() 中添加如下代码:
//加载菜单m_menu.LoadMenu(IDR_MENU1);//设置当前菜单SetMenu(&m_menu);//当你不需要菜单时可以用 SetMenu(NULL);来取消当前菜单
三、往基于Dialog的程序添加工具栏:
[1] 先添加工具栏(IDR_TOOLBAR1)资源,并画好各个按钮。
[2] 在CFileNameDlg类声名中添加成员变量 CToolBar m_wndtoolbar;
[3] 在CFileNameDlg::OnInitDialog() 中添加如下代码
//添加一个平面工具条
if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT , WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(4,4,0,0)) || !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) ){TRACE0("failed to create toolbar/n");return FALSE;}m_wndtoolbar.ShowWindow(SW_SHOW);RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
四、改变对话框背景色:
在CDlgMenuToolbarDlg::OnPaint()中修改代码实现Dialog 填充颜色:
CPaintDC dc(this);CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(60,110,170));
方法二、在InitInstance()(不是OnInitDialog())中加入:
SetDialogBkColor(RGB(255,0,0),RGB(0,255,0));
注意:要放在InitInstance函数的最前面!
五、为dialog的工具栏添加工具提示:
[1] 在CFileNameDlg类定义中手工添加消息映射函数的定义,如下黑体部分
//{{AFX_MSG(CFileNameDlg)virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);//}}AFX_MSGDECLARE_MESSAGE_MAP()
[2] 在CFileNameDlg.cpp添加函数的实现代码
//工具栏提示
BOOL CFileNameDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult){ ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // UNICODE消息 TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; //TCHAR szFullText[512]; CString strTipText; UINT nID = pNMHDR->idFrom; if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) { // idFrom为工具条的HWND nID = ::GetDlgCtrlID((HWND)nID); } if (nID != 0) //不为分隔符 { strTipText.LoadString(nID); strTipText = strTipText.Mid(strTipText.Find(’/n’,0)+1); #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) { lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); } else { _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #else if (pNMHDR->code == TTN_NEEDTEXTA) { _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText)); } else { lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #endif *pResult = 0; // 使工具条提示窗口在最上面 ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE| SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; } return TRUE;}
[3] 在CFileNameDlg.cpp中添加消息映射,请看如下代码中的黑体部分
BEGIN_MESSAGE_MAP(CFileNameDlg, CDialog)//{{AFX_MSG_MAP(CFileNameDlg)ON_WM_PAINT()ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )//}}AFX_MSG_MAPEND_MESSAGE_MAP()
[4] 在CFileNameDlg.h中添加声明:
BOOL CFileNameDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
六、给没有工具栏的窗口添加工具栏:
在资源管理器中编辑工具栏,并将其属性改为IDR_MAINFRAME,然后在MainFrm.h中声明:
CToolBar m_wndToolBar;
在MainFrm.cpp中添加:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ m_wndToolBar.Create(this); m_wndToolBar.LoadToolBar(IDR_MAINFRAME); ……;}
停靠工具栏:在刚才添加的后面加入下面代码:
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);//控制是否开启任意停靠
完善一下功能:
在菜单中添加一项“工具栏”,ID设为ID_VIEW_TOOLBAR,一切OK,试试吧!
七、创建分隔窗口:
只有框架类可以创建分隔,分隔可以嵌套。
在.h文件中声明 CSplitterWnd m_wndSplitter;并且包含COneView.h(新建视图类)和CWinFrame.h(新建框架类)文件;
然后在.cpp文件中加入:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){ if(!m_wndSplitter.CreateStatic(this,1,2)) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(COneView),CSize(240,420),pContext)) return FALSE; if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CWinFrame),CSize(300,500),pContext)) return FALSE; return TRUE;}
当用户创建好分割窗口后,有时并不希望通过拖动切分条来调节窗口的大小。这时就必须锁定切分条。锁定切分条的最简单的方法莫过于不让 CSplitterWnd来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是将这些消息交给CWnd窗口进行处理,从而屏蔽掉这些消息。拿WM_LBUTTONDOWN处理过程来说。修改为如下:
void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point){ CWnd::OnLButtonDown(nFlags,point);}
其余的处理方法类似。
八、“打开”按钮的设置:
用类向导创建该按钮的click函数,选择默认值OnOpen,加入以下代码:
void CYourDlg::OnOpen(){ char szFileFilter[]= "BIN File(*.bin)|*.bin|" "All File(*.*)|*.*||";//文件类型过滤 CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter); /* CFileDialog dlg(FALSE); dlg.m_ofn .lpstrFilter =_T("文本文件(*.txt)*.txt所有文件(*.*)*.*"); dlg.m_ofn.lpstrDefExt=_T("txt"); */ if(dlg.DoModal()==IDOK) { m_path = dlg.GetPathName();//将显示路径的Edit控件命名为m_path,并增加CString变量m_path UpdateData(FALSE); } }
九、窗口居中:
在初始化(OnInit)函数中增加:CenterWindow();即可
十、对话框加状态条:
UINT indicators[]={ID_INITMESSAGE,ID_SEPARATOR,ID_TIMEMESSAGE,ID_PROGRESS};m_statusbar.CreateEx(this,0,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM);m_statusbar.SetIndicators(indicators,4);m_statusbar.ShowWindow (SW_SHOW);RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
十一、设置初始窗口状态:
BOOL CObjectNameApp::InitInstance(){ m_pMainWnd->SetWindowText(""); //设置初始窗口标题文本 m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);//设置初始窗口为最大化 m_pMainWnd->UpdateWindow();}
对于MDI函数SetWindowText无效,主窗口的标题只能在资源列表中修改,子窗口标题在**doc.cpp中重载OnNewDocument(),调用SetTitle("LGdownload中文版");来修改。
设置初始窗口最大化的另一优化方法:
void CMainFrame::ActivateFrame(int nCmdShow){ // TODO: Add your specialized code here and/or call the base class nCmdShow=SW_MAXIMIZE; CFrameWnd::ActivateFrame(nCmdShow);}
十二、对话框透明特效:
在OnInitDialog()中加入以下代码:
//加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);HINSTANCE hInst = LoadLibrary("User32.DLL");if(hInst){ typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); MYFUNC fun = NULL; //取得SetLayeredWindowAttributes函数指针 fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if(fun)fun(this->GetSafeHwnd(),0,128,2); FreeLibrary(hInst);}
注意:fun的参数128不能太小,否则就完全透明了!
十三、设置对话框里的STATIC控件颜色属性:
在该对话框增加WM_CTLCOLOR事件,加入以下代码:
if( nCtlColor==CTLCOLOR_STATIC ){ pDC->SetTextColor(RGB(255,255,255)); pDC->SetBkColor(RGB(91,145,244)); pDC->SetBkMode(TRANSPARENT); //设置透明}
设置STATIC控件背景透明:
if( nCtlColor==CTLCOLOR_STATIC ){ pDC->SetBkMode(TRANSPARENT); //设置透明 return (HBRUSH)::GetStockObject(NULL_BRUSH);}
十四、使窗口的最大化和最小化按钮消失:
在PreCreateWindow函数中添加以下代码即可:
int xSize = ::GetSystemMetrics( SM_CXSCREEN ); int ySize = ::GetSystemMetrics( SM_CYSCREEN ); cs.cx = xSize * 6 / 10; cs.cy = ySize * 6 / 10; cs.x = ( xSize - cs.cx ) / 2; cs.y = ( ySize - cs.cy ) / 2; cs.style &= ~WS_THICKFRAME; cs.style &= ~( WS_MAXIMIZEBOX | WS_MINIMIZEBOX ); cs.dwExStyle |= WS_EX_TOOLWINDOW;
十五、设置控件字体颜色:(例如STATIC控件)
在OnCtlColor函数中添加如下代码:(可能需要选择STATIC的简单属性)
if(nCtlColor==CTLCOLOR_STATIC) { pDC->SetTextColor(RGB(255,0,0)); pDC->SetBkColor(RGB(128,128,128));//设置文本背景色 pDC->SetBkMode(TRANSPARENT);//设置背景透明}
其他控件的宏定义为:
.CTLCOLOR_BTN 按钮控件
.CTLCOLOR_DLG 对话框
.CTLCOLOR_EDIT 编辑框
.CTLCOLOR_LISTBOX 列表控件
.CTLCOLOR_MSGBOX 消息控件
.CTLCOLOR_SCROLLBAR 滚动条控件
.CTLCOLOR_STATIC 静态控件
十六、将字符转换为数字:
int i = atoi("12345"); 或 sscanf("12345","%d",&i);
十七、调用外部应用程序可使用的函数:
CreateProcess、WinExec、ShellExecute。
例:ShellExecute(pWnd->m_wnd, "open", "my.exe", NULL, NULL, SW_NORMAL)
一、父窗体句柄,二、命令"open",三、文件路径,四、参数,五、运行路径,六、显示方式
十八、经典安装程序制作软件:InstallShield for Microsoft Visual C++6.0
release 方式是在build菜单中的Set Active configuration中改
在project菜单里面,选Add to Project的component and control来加入ocx控件
十九、控件的注册:
1.注册
regsvr32 x:/xxx/demo.ocx 不一定非得在 Windows 系统目录
2.卸载
regsvr32 /u x:/xxx/demo.ocx
二十、获取当前时间:
CTime m_time=CTime::GetCurrentTime();char szText[100];memset(szText,0,100);sprintf(szText,"%d_%d_%d",m_time.GetHour(),m_time.GetMinite(),m_time.GetSecond());// 如何得到当前时间日期CTime time = CTime::GetCurrentTime(); CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S");// 方法二SYSTEMTIME ti;GetSystemTime(&ti); // 如何得到当前时间日期ti.wMilliseconds; // 得到毫秒时间SYSTEMTIME time;CString str;GetLocalTime( &time );str.Format( "%04d:%02d:%02d",time.wYear,time.wMonth.....);
二一、修改单文档程序的标题:
OnCreat()中加入 SetWindowText("weichao");CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中加入 cs.style =WS_OVERLAPPEDWINDOW;
二二、隐藏程序在任务栏的图标:
对话框程序放OnInitDialog()函数:
SetWindowLong(this->m_hWnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW);//隐藏任务拦按钮
二三、读取编辑框内容:
GetDlgItemText(IDC_EDIT_TXDATA,m_strTXData);
二四、自绘菜单宽度不对,高度是对的,解决办法:
在ClassWizard中的ClassName下,选CMianFrame,在Messages下选WM_CONTEXTMENU并生成相应的函数,如下:
void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point){ CMenu menu; menu.LoadMenu(IDR_MENU1);//IDR_MENU1是你要弹出菜单的ID号. CMenu *popup=menu.GetSubMenu(0); popup->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);}
二五、重启计算机:
调用一个API函数ExitWindowsEx就可以了, 两个参数:UFlag,标记,可以选择EWX_REBOOT,EWX_SHUTDOWN,EWX_POWEROFF再或上EWX_FORCE第二个参数就是0了
二六、无title对话框的移动:
void CScreenSnapDlg::OnLButtonDown(UINT nFlags, CPoint point){ //实现窗体无标题移动 PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y)); CDialog::OnLButtonDown(nFlags, point);}
二七、获取操作系统版本:
OSVERSIONINFO OsVersionInfo;//包含操作系统版本信息的数据结构OsVersionInfo.dwOSVersionInfoSize= sizeof(OSVERSIONINFO);GetVersionEx(&OsVersionInfo);//获取操作系统版本信息
二八、设置对话框为最顶层:(在OnInitDialog中添加)
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
二九、对话框程序不在任务栏显示:(在OnInitDialog中添加)
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
三十、向对话框窗口添加右键菜单:
CMenu menu,*pmenu; menu.LoadMenu(IDR_MENU1); pmenu=menu.GetSubMenu(0); CPoint ptScreen(point); ClientToScreen(&ptScreen); pmenu->TrackPopupMenu(TPM_RIGHTBUTTON,ptScreen.x,ptScreen.y,this);
三一、文件查找:(例查找连续的换行符)
FILE *fp,*fp1;int flag=0;int ch;fp=fopen("c://test.txt","r");fp1=fopen("c://wrttest.txt","w");while(!feof(fp)){ ch=fgetc(fp); if(feof(fp)) break; if(ch==’/n’&&flag==1) continue; else if(ch==’/n’&&flag==0) flag=1; else flag=0; fputc(ch,fp1);}fclose(fp1);fclose(fp);
三二、托盘菜单不点击不能消失的解决办法:
在菜单之后使用下述代码:
CPoint pt; GetCursorPos(&pt); SetForegroundWindow(); NotifyMenu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this); PostMessage(WM_NULL,0,0);
三三、对话框由小到大显示的动画效果:
在InitDialog中增加:
ShowWindow(SW_HIDE);CRect dlgRect;GetClientRect(&dlgRect);CPoint centerPoint;centerPoint.x=dlgRect.Width()/2;centerPoint.y=dlgRect.Height()/2;//得到对话框的中点坐标CRgn testrgn;this->ShowWindow(SW_HIDE); int m=GetSystemMetrics(SM_CYSIZEFRAME);//以下代码实现对话框的动态弹出for (int i=10;i<dlgRect.Width()/2+m;i+=1){ testrgn.CreateRectRgn(centerPoint.x-i,centerPoint.y-i,centerPoint.x+i,centerPoint.y+i); SetWindowRgn((HRGN) testrgn,TRUE); ShowWindow(SW_SHOW); CenterWindow(); testrgn.DeleteObject();}
三四、按行读出文本文件:
下面的例子演示了一行一行取,直到取完。
CStdioFile myFile;CString ReadFileString;if(myFile.Open("C://Readme.txt", Cfile::modeRead) == TRUE){ while(myFile.ReadString(ReadFileString) != FALSE) { //... 处理代码 }}
三五、使用IDC_HAND时提示未定义,加入以下代码:
#if(WINVER >= 0x0500)#define IDC_HAND MAKEINTRESOURCE(32649)#endif /* WINVER >= 0x0500 */
三六、使应用程序启动时不自动创建新文档
在默认情况下,用AppWizard开发的SDI/MDI应用程序在启动时创建一个新的文档。如果要使应用程序在启动时不创建新文档,只需在应用类 CmyApp::InitInstance()函数的ProcessShellCommand调用前加上下面的语句就可以了:
cmdInfo.m_nShellCommand = CComandLineInfo::FileNothing;
三七、播放mp3:
CFileDialog file(true);if(file.DoModal()==IDOK){ CString filename=file.GetFileName(); if(hwnd!=NULL) { MCIWndDestroy(hwnd); } hwnd=MCIWndCreate(this->m_hWnd,NULL,MCIWNDF_NOPLAYBAR,filename); ::ShowWindow(hwnd,SW_HIDE); MCIWndSetVolume(hwnd,1000); MCIWndPlay(hwnd);}
三八、获取屏幕RGB值:OnTimer中添加
CPoint pos;GetCursorPos(&pos);//获取鼠标坐标HDC hDC = ::GetDC(NULL);COLORREF clr = ::GetPixel(hDC, pos.x, pos.y); CString ClrText;ClrText.Format("R:%d G:%d B:%d",GetRvalue(clr),GetGvalue(clr),GetBvalue(clr));
三九、打开一个网址:
打开[url]http://www.sina.com.cn[/url]这个站点如下:
ShellExecute(NULL, "open", "http://www.sina.com.cn",NULL, NULL, SW_MAXIMIZE );
此命令将以默认浏览器打开[url]http://www.sina.com.cn[/url],并将加开后的窗口最大化。
又例:
ShellExecute(NULL, "open", "IEXPLORE.exe [url]http://www.sina.com.cn[/url]",NULL, NULL, SW_MAXIMIZE );
此命令将直接用IE打开一个sina的站点。不过将开一个新的窗口。
四十、位图按钮:
CButton *pRadio = (CButton*)GetDlgItem(IDC_RADIO);pRadio->SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP)));
- 工作问题积累(十八)VC界面编程总结
- VC++界面编程总结
- VC++界面编程总结
- VC++界面编程总结
- VC 界面编程总结
- VC界面编程总结
- VC 界面编程总结
- VC++界面编程总结
- VC++界面编程总结
- 工作问题积累(六)截屏并且保存 VC++
- Qt界面编程积累
- 工作问题总结(二十八)JS调用---网页调用C++程序,可传参
- VC++界面编程(转)
- 工作问题积累(十七)停止屏幕保护程序
- 工作小问题积累
- 界面编程:vc美化界面
- 积累的VC编程--图标、光标及位图(转)
- VC界面编程入门(一)
- 排列组合
- 完美解决C# DataGridView控件显示不同表的问题
- listview 上拉加载更多
- TMS320C64x+ DSP-----Cache 优化
- 数论模版
- 工作问题积累(十八)VC界面编程总结
- 【玩转微信公众平台之三】 基本操作
- 广义表法建立二叉树
- 全志A20一些具体工作
- DSP优化,通用的调整性能的策略
- vcs的plusagrs使用技巧
- 一个C#程序,用到了双向链表
- 浅谈PHP 5中垃圾回收算法的演化
- 智慧城市,在中国的北海边再画一个圈——大连“中国首届智慧城市协同创新峰会”请你带好笔