• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
thankgoodness
博客园    首页    新随笔    联系   管理    订阅  订阅

学习VC中所得的点点技术心得4 (转)

151 改变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
http://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

 
posted @ 2008-04-28 08:20  宇晨  阅读(364)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3