专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C 教程 » vc学习心得:[转载]学习VC中所得的点点技术心得... »正文

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条 分0页

发表评论

  • 昵称:
  • 内容: