vc学习心得:[转载]学习VC中所得的点点技术心得...来源: 发布时间:星期五, 2008年12月5日 浏览:2次 评论:0
改变CStatic控件的前景、背景色:http://community.csdn.net/Expert/topic/4507/4507710.xml?temp=.1524164
处理WM_CTLCOLOR消息: --------------------------------------------------------------------- HBRUSH CQQDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr; // TODO: Change any attributes of the DC here if(CTLCOLOR_STATIC == nCtlColor) //if(CTLCOLOR_STATIC == nCtlColor && pWnd->GetDlgCtrlID()==IDC_TOOL) //改成这样就只对IDC_TOOL这一个静态文本控件起作用了 { pDC->SetBkColor(RGB(255,255,255)); //背景色为白 pDC->SetTextColor(RGB(0,0,0)); //前景色为黑 hbr = CreateSolidBrush(RGB(255,255,255)); //其它区域也为白 //上面三行代码改成下面这三行就创建空心刷子,就可以实现在背景上写字的效果了 //pDC->SetBkMode(TRANSPARENT); //pDC->SetTextColor(RGB(0,0,0)); //hbr = CreateStockObject(NULL_BRUSH); } else hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Return a different brush if the default is not desired return hbr; } ---------------------------------------------------------------------- 再加一个判断if (pWnd->GetDlgCtrlID()==IDC_....)就可以指定是改变哪个的颜色了,其它控件的颜色的改变方法和这个大同小异。 152 怎样获得字体得宽度,高度,间距等信息:GetTextMetrics 153 为了让你对i++有个更清楚的认识,先看如下代码: ------------------- int i=2; i=(i++) % 3; printf("i=%d",i); //这里输出i=?呢 ------------------- 下面是前两行代码的汇编代码: ------------------------------------------------------------------------------------------------------------------ 00401778 mov dword ptr [ebp-4],2 把值2写入内存中[ebp-4]指向的位置(后面称变量i) //相当于i=2 0040177F mov eax,dword ptr [ebp-4] 把i的当前值2赋于eax中 //把eax当成了i的临时变量了 00401782 cdq 00401783 mov ecx,3 把3赋于ecx中 //同样ecx也成了临时变量了 00401788 idiv eax,ecx eax % ecx(2%3),结果放入edx中(等于2) 0040178A mov dword ptr [ebp-4],edx 把edx中的值2写入变量i //相当于计算i=2 % 3 0040178D mov edx,dword ptr [ebp-4] 把i的值2赋于edx //现在edx成了i的临时变量 00401790 add edx,1 edx中的值加上1 00401793 mov dword ptr [ebp-4],edx 把edx中的值3写入变量i //上面三条命令完成i=i+1 ------------------------------------------------------------------------------------------------------------------ 最终的结果i=3,如果把运算符%换成+,则结果i=6(注意,这是在VC下得到的结果,不同的编译器得到的结果可能会不同!) 154 我的程序知道一个应用程序的句柄,如何使该应用程序得到焦点:http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=192872 --------------------------------------------------------------- if(::GetForegroundWindow()!=m_MainWnd) ::SetForegroundWindow(m_MainWnd); ::SetFocus( m_MainWnd); --------------------------------------------------------------- 或: ------------------------------------ ::ShowWindow(m_MainWnd, SW_SHOW); ::SetForegroundWindow(m_MainWnd); ------------------------------------ 155 在对话框的标题栏上添加按钮:http://www.codeguru.com/Cpp/W-D/dislog/titlebar/article.php/c1897 156 判断当前线程的当前输入法是中文还是英文输入法(至于到底是哪种中文输入法我也不知道): ------------------------------------------------------------------------- HKL hKl = GetKeyboardLayout(0); //这里0表示当前线程,要查指定线程的话可以用指定线程的标识符代替 if (ImmIsIME(hKl)) AfxMessageBox("当前是中文输入法。"); ------------------------------------------------------------------------- 其它地区语言输入法的信息在MSDN中搜索:Table of Language Identifiers 157 动态创建静态控件并加载.bmp图片,先在对话框类中定义成员变量: ---------------------------------------------------- public: CStatic m_pp; //这个是在对话框类中定义的 再: CBitmap cb; cb.LoadBitmap(IDB_BITMAP1); m_pp.Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP,CRect(10,10,200,200),this,101); m_pp.SetBitmap((HBITMAP)cb); ---------------------------------------------------- 158 DLL中创建窗口时对于资源等,需要先进行状态处理:AFX_MANAGE_STATE(AfxGetStaticModuleState( )); 159 把图片中某种指定色变成透明色,在对话框的OnPaint()中加入类似如下代码: ------------------------------------------------------------------------------- //CImage imgOriginal; int XWitdh=imgOriginal.GetWidth(); int XHeight=imgOriginal.GetHeight(); COLORREF TransparentColor= RGB(0x00,0x00,0x00); //这里黑色变成透明色 CPaintDC dc(this); imgOriginal.TransparentBlt(dc.m_hDC,0,0,XWitdh,XHeight,TransparentColor); imgOriginal.StretchBlt(dc,0,0,imgOriginal.GetWidth()/2,imgOriginal.GetHeight()/2,SRCCOPY); ------------------------------------------------------------------------------- 160 怎么修改MFC单文档程序的标题,经常有人在网上问这个问题,在C****App::InitInstance()的代码中加入一行就行了: ----------------------------------------------------------- BOOL CJPGGifApp::InitInstance() { AfxEnableControlContainer(); ...... //这里省略自动生成的代码 // The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); m_pMainWnd->SetWindowText("我的标题"); //加入这一行就可以了,注意要加在ShowWindow和UpdateWindow的后面 return TRUE; } ------------------------------------------------------------ 161 怎么使用双缓冲防闪烁:http://community.csdn.net/Expert/topic/4236/4236258.xml?temp=5.736941E-02 <==========还没试,不知道有没有效果 162 鼠标左右键同时按下与鼠标与键盘同时按下的识别:http://www.vckbase.com/article/misc/0017.htm 玩过Windows的扫雷游戏吗?该游戏中就有一个同时按下鼠标左右键的操作,其实对同时按下鼠标左右键的判断并不复杂,判断方法与判断鼠标按键是否与Ctrl和Shift同时按下的方法相同,这里要用到鼠标消息中的wparam项,其中含有我们想要的几个按键的状态。定义如下: (1)MK_CONTROL:Ctrl键按下时置1; (2)MK_LBUTTON:鼠标左键按下时置1; (3)MK_MBUTTON:鼠标中键按下时置1; (4)MK_RBUTTON:鼠标右键按下时置1; (5)MK_SHIFT:Shift键按下时置1。 通过判断这几个标志位可以得到同时按下的几个键的状态,从而判断是否有其它键同时按下。 163 数据库方面:http://community.csdn.net/Expert/topic/4500/4500287.xml?temp=.2734644 <===================还没试 164 取得Excel中文本框的内容:http://community.csdn.net/Expert/topic/4356/4356294.xml?temp=.41 165 Microsoft Office Development with Visual Studio:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/vsofficedev.asp 166 让编译器忽略某种警告: -------------------------------- #pragma warning (disable : 4101) -------------------------------- 上面的代码加上后编译器不会再出现warning C4101: 'i' : unreferenced local variable这样的警告了。 167 枚举网页各个元素,参考: http://www.vckbase.com/document/viewdoc/?id=288 http://www.vckbase.com/document/viewdoc/?id=1446 168 rundll32.exe,这个程序很方便,用它可以调用任何 DLL 中的函数。你只要给它提供 DLL、函数名以及要传递的参数即可。Rundll32.exe 绝对多才多艺,你可以用它来关闭和重启 Windows,创建快捷方式以及启动控制面板程序。只要知道要调用的DLLs,一切都搞掂。你可以象下面这样用 rundll32.exe 从命令行打开一个 URL: -------------------------------------------------------- rundll32.exe url.dll,FileProtocolHandler www.vckbase.com -------------------------------------------------------- url.dll 中的函数 FileProtocolHandler 负责这个工作。 169 HDC===>CDC* ---------------------------------- HDC hdc=::GetWindowDC(this->m_hWnd); //获得窗口标题栏区域 CDC* pDC = CDC::FromHandle(hdc); ---------------------------------- CDC*===>HDC,可以通过CDC的操作符HDC()来实现: ------------------ HDC hdc=HDC(pDC); //或:HDC hdc=pDC->m_hdc; ------------------ 170 操作状态栏,下面以在状态栏中显示鼠标当前坐标为例,代码如下: ------------------------------------------------------------------------------------------- CMyView::onMouseMove(UINT nFlag,CPoint point) { CClientDC dc(this); CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd; CStatusBar *pStatusBar = (CStatusBar *)&pFrame->m_wndStatusBar; CString str; str.Format("x:%d,y:%d",point.x,point.y); CSize size = dc.GetTextExtent(str); //得到文本所需的大小尺寸 int nIndex = pStatusBar->CommandToIndex(ID_INDICATOR_MOUSEPOS); pStatusBar->SetPaneInfo(nIndex,ID_INDICATOR_MOUSEPOS,SBPS_NORMAL,size.cx); //按文本所需的宽度设置状态栏宽度 pStatusBar->SetPaneText(nIndex,str); CView::onMouseMove(nFlags, point); } ------------------------------------------------------------------------------------------- 171 一些工具的简单介绍:http://www.yesky.com/SoftChannel/72347895172431872/20050306/1918484.shtml 172 一个有争论的问题,关于delete p和delete []p的区别所在:http://community.csdn.net/Expert/topic/4402/4402653.xml http://community.csdn.net/Expert/topic/4411/4411478.xml?temp=.5596582 173 GetDeviceCaps,一个可得到很多关于指定设备的具体信息的函数 174 注册表中:HKEY_CURRENT_USER\KeyboardLayout\preload分支下分别有输入法对应的1、2、3、4几个主键,其键值一一对应已安装的输入法,如:1的键值00000409是英文输入法,知道具体输入法和键值的对应关系后,我们可以根据得到的键值判断用户的当前输入法了。 175 在托盘区处显示气泡提示:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/iusernotification/SetBalloonInfo.asp 176 设置对话框的背景色的简单方法,其实只要在CWinapp的InitInstance的里面添加一行代码就行了: --------------------------------------------------------- BOOL CBOOKApp::InitInstance() { AfxEnableControlContainer(); SetDialogBkColor(RGB(213,240,227),RGB(173,7,95)); //添加这行,前者为背景色,后者为前景色 ..... } --------------------------------------------------------- 177 显示gif动画表情的CRechEdit控件:http://lzzqqq.blogchina.com/2819759.html 178 单文档程序,如何使程序窗口一开始就固定在某一尺寸:PreCreateWindow中指定大小.可以去掉框架窗口的WS_THICKFRAME风格来使窗口不可改变大小,可以选择性的去掉WS_MAXIMIZEBO风格。也可以处理WM_GETMINMAXINFO消息来限制视图的大小。 179 CSpinButtonCtrl:http://www.ruanxun.com/HArticle78020.aspx 180 限制用户调整窗口的最大、最小尺寸,在窗口的WM_GETMINMAXINFO消息响应函数中处理,如: --------------------------------------------------------------------------- void CQQDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { // TODO: Add your message handler code here and/or call default lpMMI->ptMinTrackSize.x=200; //限制最小宽度,单位为像素,下同 lpMMI->ptMinTrackSize.y=400; //限制最小高度 lpMMI->ptMaxTrackSize.x=250; //限制最大宽度 lpMMI->ptMaxTrackSize.y=500; //限制最大高度 CDialog::OnGetMinMaxInfo(lpMMI); } --------------------------------------------------------------------------- 181 获取桌面所有图标的标题,代码示范了如何使用VirtualAlloc(),WriteProcessMemory() 和 ReadProcessMemory() 在不同的进程中分配内存。用Windows的消息获得图标的名称: 下载源码:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101&page=6 182 一台机器可能有不止一个CD-ROM驱动器。现在CD-ROM已经是PC机的标准配置,此外再装个可擦写的光盘驱动,甚至是DVD都是很常见的事情。不管一台机器上装多少个不同的驱动器,如何找到它们呢?下载源码:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101&page=6 183 做一个类似文件快捷方式中查找目标的功能,Net 2003中的MSDN,找到了可以实现该功能的API,SHOpenFolderAndSelectItems()函数.....本程序可以调用Explore打开指定文件夹,并把指定文件置为选定状态,下载源码:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101 184 字符串转为Unicode: ----------------------------------------------------------------- WCHAR wsz[MAX_PATH]; CString str="字符串"; #ifdef _UNICODE wcscpy(wsz, str); //如果工程支持Unicode的话用wcscpy函数 #else //工程不支持的话用MultiByteToWideChar函数转换 MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH); #endif ----------------------------------------------------------------- 也可以用c的函数库的函数: mbtowc 转一个字符 mbstowcs 转字符串 185 向一个进程外窗口发送WM_SHOWWINDOW消息,隐藏或显示该窗口: ----------------------------------------------------- HWND hwnd=::FindWindow(0,"ddd"); //隐藏"ddd"窗口 ::PostMessage(hwnd,WM_SHOWWINDOW,FALSE,SW_OTHERZOOM); //参数3为FALSE时隐藏,为TRUE则显示该窗口 ----------------------------------------------------- 上面代码有可能失败,因为WM_SHOWWINDOW只是窗口准备改变状态时,系统发出的消息,并不能控制窗口状态的改变。另一个方法可以把后面一句改成:ShowWindow(hwnd,SW_HIDE); 186 使用24位色彩图标的工具条,有源码范例的:http://www.codeguru.com/Cpp/controls/toolbar/article.php/c2537 187 设置CListCtrl控件图标间距离的方法:CListCtrl::SetIconSpacing 188 设置层叠窗口的透明色函数:SetLayeredWindowAttributes,部分代码参考: ------------------------------------------------------------------------- SetWindowLong(this->m_hWnd,GWL_EXSTYLE,GetWindowLong(this->m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED); HWND hWnd=this->m_hWnd; typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD); PSLWA pSetLayeredWindowAttributes; HMODULE hDLL = LoadLibrary ("user32"); pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes"); if (pSetLayeredWindowAttributes != NULL) { pSetLayeredWindowAttributes (hWnd,0,20,LWA_ALPHA); } FreeLibrary(hDLL); ------------------------------------------------------------------------- 189 关于滚动条方面的,GetScrollInfo获得滚动条位置信息: ------------------------------------ SCROLLINFO si; ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; // Call GetScrollInfo to get current tracking position in si.nTrackPos GetScrollInfo(hwnd, SB_HORZ, &si); ----------------------------------- 让滚动条滚动需要发送相应的WM_VSCROLL和WM_HSCROLL消息: SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ; SetScrollInfo函数改变滚动条的位置。 190 切换到软键盘:call ImmSetConversionStatus with IME_CMODE_SOFTKBD 191 用SetVolumeLabel函数修改U盘卷标时据说windows会刷新里面的内容。 <===================还没试 192 基于对话框的MFC程序想要具有打印功能:http://community.csdn.net/Expert/topic/4557/4557847.xml?temp=.5908472 193 打开那个标题为"打开方式..."的对话框来选择程序:WinExec("rundll32.exe shell32.dll,OpenAs_RunDLL path\filename",SW_RESTORE); 194 如何屏蔽主窗口的最大化按钮,并让其自动最小化:http://community.csdn.net/Expert/topic/4563/4563807.xml?temp=.9465906 195 从立体声的wave文件中分别提出左声道和右声道的声音数据,实现音频文件的播放——单声道录音、立体声录音并保存为.wav文件,以及VC.NET简单实现GIF动画: http://www.vckbase.com/code/listcode.asp?mclsid=7 196 DirectX Input获得鼠标输入:http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=2 197 数字水印算法的实现:[url=http://www.vckbase.com/code/listcode.asp?mclsid=7&a 0
相关文章读者评论
发表评论 |