现在的位置: 首页 > 综合 > 正文

VC技巧–03

2013年02月19日 ⁄ 综合 ⁄ 共 12523字 ⁄ 字号 评论关闭

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 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 数字水印算法的实现:http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=3
198 程序如何加入全局热键:RegisterHotKey注册热键,响应WM_HOTKEY消息来截获热键:http://www.xiaozhou.net/cooldog/blogview.asp?logID=78
199 读取其它进程内存中的数据:ReadProcessMemory
200 给程序加上系统托盘图标:http://www.vckbase.com/bbs/prime/viewprime.asp?id=260
下面是简单的代码:
--------------------------------------------------------------
NOTIFYICONDATA nid;
//初始化系统托盘图标
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 100;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_USER+20;
nid.hIcon=LoadIcon(NULL,IDI_APPLICATION); //图标
strcpy(nid.szTip, "My Tooltip Text");      //提示
Shell_NotifyIcon(NIM_ADD, &nid);
--------------------------------------------------------------

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/snow_ice11111/archive/2006/04/10/552696.aspx

抱歉!评论已关闭.