1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改。
2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息。
3 Java学习书推荐:《java编程思想》
4 在VC下执行DOS命令
a. system("md c://12");
b. WinExec("Cmd.exe /C md c://12", SW_HIDE);
c. ShellExecute
ShellExecute(NULL,"open","d://WINDOWS//system32//cmd.exe","/c md d://zzz","",SW_SHOW);
d. CreateProcess
下面这个示例的函数可以把给定的DOS命令执行一遍,并把DOS下的输出内容记录在buffer中。同时示范了匿名管道重定向输出的用法:
-------------------------------------------------------------------------------------
BOOL CDOSDlg::ExecDosCmd()
{
#define EXECDOSCMD "dir c:" //可以换成你的命令
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return FALSE;
}
char command[1024]; //长达1K的命令行,够用了吧
strcpy(command,"Cmd.exe /C ");
strcat(command,EXECDOSCMD);
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //把创建进程的标准错误输出重定向到管道输入
si.hStdOutput = hWrite; //把创建进程的标准输出重定向到管道输入
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
CloseHandle(hWrite);
CloseHandle(hRead);
return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0}; //用4K的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
AfxMessageBox(buffer); //这里是弹出对话框显示
}
CloseHandle(hRead);
return TRUE;
}
-------------------------------------------------------------------------------------
5 删除目录,包含删除子文件夹以及其中的内容
-------------------------------------------------
BOOL DeleteDirectory(char *DirName)//如删除 DeleteDirectory("c://aaa")
{
CFileFind tempFind;
char tempFileFind[MAX_PATH];
sprintf(tempFileFind,"%s//*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[MAX_PATH];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
char tempDir[MAX_PATH];
sprintf(tempDir,"%s//%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[MAX_PATH];
sprintf(tempFileName,"%s//%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName))
{
MessageBox(0,"删除目录失败!","警告信息",MB_OK);//比如没有找到文件夹,删除失败,可把此句删除
return FALSE;
}
return TRUE;
}
-------------------------------------------------------------
6 让程序暂停:system("PAUSE");
7 在PreTranslateMessage中捕捉键盘事件
if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)return TRUE; //注意return的值
8 更改按键消息(下面的代码可把回车键消息改为TAB键消息)
-------------------------------------------------------
BOOL CT3Dlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam)
{
pMsg->wParam = VK_TAB;
}
return CDialog::PreTranslateMessage(pMsg);
}
------------------------------------------
9 MoveWindow: 一个可以移动、改变窗口位置和大小的函数
10 16进制转化成10进制小数的问题
用一个读二进制文件的软件读文件
二进制文件中的一段 8F C2 F5 3C 最后变成了 0.03
请问这是怎么转换过来的??
方法一:浮点技术法,如
DWORD dw=0x3CF5C28F;
float d=*(float*)&dw;//0.03;
方法二:浮点的储存方式和整数完全两样,你想了解的话可以去
http://www.zahui.com/html/1/3630.htm
看一看,不过通常我们都不必了解它就可以完成转换。
char a[4] = {0x8F, 0xC2, 0xF5, 0x3C};
float f;
memcpy(&f,a,sizeof(float));
TRACE("%d",0x3CF5C28F);
11 EDIT控件的 EM_SETSEL,EM_REPLACESEL消息
12 在其它进程中监视键盘消息:用SetWindowsHookEx(WH_KEYBOARD_LL,...);
13 在桌面上任意位置写字
--------------------------------------------------
HDC deskdc = ::GetDC(0);
CString stext = "我的桌面";
::TextOut(deskdc,100,200,stext,stext.GetLength());
::ReleaseDC(0,deskdc);
------------------------------------------------------
14 HWND thread_hwnd=Findwindow(NULL,"你要监控的进程窗体(用SPY++看)"),
if (thread_hwnd==NULL) 。。。。。。。。。。
else DWORD thread_id=GetWindowThreadProcessId(thread_hwnd,NULL)
15 waveOutGetVolume()可以得到波形音量大小
16 隐藏桌面图标并禁用右键功能菜单:
------------------------------------
HWND Hwd = ::FindWindow("Progman", NULL);
if (bShowed)
::ShowWindow(Hwd, SW_HIDE);
else
::ShowWindow(Hwd, SW_SHOW);
bShowed = !bShowed;
---------------------------------------
17 获得程序当前路径:
---------------------------------------------
char ch[256];
GetModuleFileName(NULL,ch,255);
for(int i=strlen(ch);i && ch[i]!='//';i--);
ch[i]=0;
AfxMessageBox(ch);
----------------------------------------------
18 KeyboardProc的lParam中包含着许多按键信息,其中第31位(从0开始)为0表示是按下按键,为1表示松开按键。
(lParam & 0x80000000)进行二进制'与'计算,效果是取第31位的值。
(lParam & 0x40000000)是取第30位,30位表示按键的上一个状态,为1表示之前键已经是按下的,0表示松开。
lParam
[in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.
0-15
Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key.
16-23
Specifies the scan code. The value depends on the OEM.
24
Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.
25-28
Reserved.
29
Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
31
Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.
19 复制文件应该用到CopyFile或是CopyFileEx这两个API
20 移动窗口的位置或改变大小:MoveWindow/SetWindowPos
21 我的程序是当前运行的程序时,可以用setcursor()来设置光标的图标。
而且可以用setcapture()是鼠标移动到我得程序窗口之外时也是我设置的图标
但是如果我得程序不是当前的运行程序的,鼠标就会变会默认的。
怎样能够,使得不变回默认的,还是用我设置的光标?
SetSystemCursor
22 SendMessage函数的几个用法:
控制按钮按下的,是这么用的
SendMessage(n1, WM_COMMAND, MAKELPARAM(ID,BN_CLICKED),(LPARAM )n2); (n1,n2是句柄)
而得到文本内容,是这样用的,
SendMessage(hWnd,WM_GETTEXT,10,(LPARAM)buf),
23 处理一个单行EDIT的WM_CTLCOLOR要同时响应nCtlColor = CTLCOLOR_EDIT和CTLCOLOR_MSGBOX的两个情况,参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.onctlcolor.asp
24 设备发生改变处理函数可在CWnd::OnDeviceChange中,捕获WMDEVICECHANGE事件不能区分诸如设备插入、拔下消息。
25 把字符"abc/n123"存入文本文件中时,文件内容没看见换行,其实用word打开该文件是有换行的。另外用"abc/r/n123"代替也可看见换行。
26 ::SetFocus(::GetDesktopWindow());或::BringWindowToTop(::GetDesktopWindow());
::GetDesktopWindow()这里可获得桌面窗口的句柄
27 数组初始化:
int a[24][34]; //声明数组
memset(a,-1,24*34); //全部元素初始化成-1,但初始化成除0和-1以外的数值是不行的
28 SHGetFileInfo函数可获得文件信息。
29 创建一个控件:
HWND hEdit=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE |ES_LEFT,50,20,50,20,hwnd,NULL,hInst,NULL); //hwnd参数为父窗口句柄
30 VC中对声音文件的操作:http://www.pujiwang.com/twice/Article_Print.asp?ArticleID=550
31 调用其它程序又要隐藏窗口:用CreateProcess函数调用,再拿到窗口句柄,然后::ShowWindow(hWnd,SW_HIDE);
32 读取文本文件中的一行:
用CFile类的派生类:CStdioFile的方法:CStdioFile::ReadString
33 删除非空文件夹:
------------------------------------------------
SHFILEOPSTRUCT shfileop;
shfileop.hwnd = NULL;
shfileop.wFunc = FO_DELETE ;
shfileop.fFlags = FOF_SILENT|FOF_NOCONFIRMATION;
shfileop.pFrom = "c://temp"; //要删除的文件夹
shfileop.pTo = "";
shfileop.lpszProgressTitle = "";
shfileop.fAnyOperationsAborted = TRUE;
int nOK = SHFileOperation(&shfileop);
-------------------------------------------------
34 函数前面加上::是什么意思?
叫域运算符...在MFC中表示调用API...或其它全局函数...为了区分是mfc函数还是api
详见:http://search.csdn.net/Expert/topic/1183/1183492.xml?temp=.9471247
35 CImageList的用法:http://www.study888.com/computer/pro/vc/desktop/200506/39027.html
36 有关控件的一些常见问答:
http://fxstudio.nease.net/article/ocx/ <==========================很不错的地方哦
37 在多文档客户区中增加位图底图演示程序:
http://www.study888.com/computer/pro/vc/desktop/200506/39028.html
我的对应工程:AddBackgroundBitmap
38 用VC++6.0实现PC机与单片机之间串行通信
http://www.zahui.com/html/1/1710.htm
39 日期到字符串:
--------------------------------------------------
SYSTEMTIME sys;
GetSystemTime(&sys);
char str[100];
sprintf(str,"%d%d%d_%d%d%d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour+8,sys.wMinute,sys.wSecond);
//这里的小时数注意它的0:00点是早上8:00,所以要加上8,因为这是格林威治时间,换成我国时区要加8
--------------------------------------------------
CString m_strTemp;
SYSTEMTIME systemtime;
GetLocalTime(&systemtime); //这个函数可获得毫秒级的当前时间
m_strTemp.Format("%d年%d月%d日%d:%d:%d:%d 星期%d",systemtime.wYear,systemtime.wMonth,systemtime.wDay,systemtime.wHour,systemtime.wMinute,systemtime.wSecond,systemtime.wMilliseconds,systemtime.wDayOfWeek);
--------------------------------------------------
40 任务栏上的图标闪烁:
The FlashWindow function flashes the specified window once, whereas the FlashWindowEx function flashes a specified number of times.
BOOL FlashWindow(
HWND hWnd, // handle to window to flash
BOOL bInvert // flash status
);//闪烁一次
FlashWindowEx()//闪烁多次
41 十六进制字符转浮点数:http://community.csdn.net/Expert/topic/4379/4379713.xml?temp=.7092096
long lValue = 0xB28A43;
float fValue;
memcpy(&fValue,&lValue,sizeof(float));
42 在一个由汉字组成的字符串里,由于一个汉字由两个字节组成,怎样判断其中一个字节是汉字的第一个字节,还是第二个字节,使用IsDBCSLeadByte函数能够判断一个字符是否是双字的第一个字节,试试看:)
_ismbslead
_ismbstrail
43 如何实现对话框面板上的控件随着对话框大小变化自动调整
在OnSize中依其比例用MoveWindow同等缩放.http://www.codeproject.com/dialog/dlgresizearticle.asp
44 向CListCtrl中插入数据后,它总是先纵向再横向显示,我希望他先横向再纵向
在CListCtrl的ReDraw()中处理(见http://community.csdn.net/Expert/topic/4383/4383963.xml?temp=.3442041)
如:
m_list.ReDraw(FALSE);
m_list.ReDraw(TRUE);
45 给你的程序加上splash:http://www.vckbase.com/document/finddoc.asp?keyword=splash
如何添加闪屏:Project->Add to Project->Components and Controls->Gallery//Visual C++ Components->Splash screen
46 实现象快速启动栏的"显示/隐藏桌面"一样的功能:http://fxstudio.nease.net/article/form/55.txt
47 如何设置listview某行的颜色:
CSDN上的贴子:http://community.csdn.net/Expert/topic/4386/4386904.xml?temp=2.422512E-03
Codeguru上相关链接:http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c1093/
48 如何得到窗口标题栏尺寸:http://community.csdn.net/Expert/topic/4387/4387830.xml?temp=.6934168
GetSystemMetrics(SM_CYCAPTION或者SM_CYSMCAPTION);
SM_CYCAPTION Height of a caption area, in pixels.
SM_CYSMCAPTION Height of a small caption, in pixels.
--------------------------------------------------------
GetWindowRect(&rect);
rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) + 3;
--------------------------------------------------------
49 如何将16进制的byte转成CString:
---------------------------------
BYTE p[3];
p[0]=0x01;
p[1]=0x02;
p[2]=0x12;
CString str;
str.Format("%02x%02x%02x", p[0], p[1], p[2]);
-------------------------------------
50 怎样查找到正处在鼠标下面的窗口(具体到子窗口和菜单),无论是这个窗口是否具有焦点:
-----------------------------------------------------------
POINT pt;
CWnd* hWnd; // Find out which window owns the cursor
GetCursorPos(&pt);
hWnd=CWnd::WindowFromPoint(pt);
if(hWnd==this)
{
//鼠标在窗体中空白处,即不在任何控件或子窗口当中
}
51 得到CListCtrl控件点击事件时点击的位置:
-----------------------------------------------
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("单击的是第%d行第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*pResult = 0;
}
------------------------------------------------
52 如何在clistctrl的单元格里添加图片?http://community.csdn.net/Expert/topic/4388/4388748.xml?temp=.2233393
53 自己处理按键响应函数:
-------------------------------------------------
BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_KEYDOWN )
{
if(pMsg->hwnd == GetDlgItem(IDC_EDIT1)->m_hWnd) //判断当前控件是不是编辑框
{
switch( pMsg->wParam )
{
case VK_RETURN: //如果是回车键的话
Onbutton1(); //就调用Button1的响应函数
}
}
return CDialog::PreTranslateMessage(pMsg);
}
---------------------------------------------------
54 如何在VC中操纵word:http://www.vckbase.com/document/viewdoc/?id=1174
55 两个像素(用RGB表示)如何确定亮度等级:
加权算出灰度值:R*0.21+Green*0.70+Blue*0.09,或:
((红色值 X 299) + (绿色值 X 587) + (蓝色值 X 114)) / 1000
56 对已画在CDC上的图片进行处理,实现任意比例的透明度。
MSDN:http://msdn.microsoft.com/msdnmag/issues/05/12/CatWork/
实现方法是:
1、用GetCurrentBitmap得到DC上的CBitmap指针;
2、用GetBitmapBits得到CBitmap上的图像数据流;
3、对图像数据流中每个字节进行转换,转换的公式为
pBits[i] += (255 - pBits[i]) * nTransparent / 100;//nTransparent为透明度的百分率
57 MFC很多API函数的源代码都在:VC安装目录/VC98/MFC/SCR/WINCORE.cpp文件中。
58 自己写了个函数,用来获得ANSI字符串中真实字符的个数,如“I服了U”的长度返回4:
--------------------------------------------------
int GetCount(CString str)
{
int total=0;
for(int i=0;i
if (127<(unsigned int)str.GetAt(i))
{
total++;
i++;
}
else
total++;
}
return total;
}
----------------------------------------------------
59 消息传递中pMSG中一些参数的意义:
hwnd-------接收消息的窗口句柄;
message----发送的消息号;
wParam-----消息参数,具体意义同发送的消息有关;
lParam-----同上;
time-------发送消息时的时间,数值大小为自系统启动以来经历的时间,单位是毫秒;
pt---------发送消息时鼠标在屏幕上的绝对坐标,单位是像素。
60 刷新屏幕局部:
刷新控件区域:
控件ID:IDC_STATIC_STATIC
------------------------------------
CRect static_rect;
CWnd *pwnd = GetDlgItem(IDC_STATIC_STATIC);
if (pwnd == NULL)
{
return;
}
pwnd->GetWindowRect(&static_rect);
ScreenToClient(&static_rect);
InvalidateRect(&static_rect); //注意这个函数,会调用OnEraseBkgnd
--------------------------------------
61 VC实现录音,放音,保存,打开功能: http://www.pconline.com.cn/pcedu/empolder/gj/vc/0412/509819.html
62 获得任务栏高度:
----------------------------------
HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
RECT rc;
::GetWindowRect(hWnd, &rc);
int iHeight = rc.bottom -rc.top;
-----------------------------------
63 vc控制word、excel的问题:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/vsofficedev.asp
下面还有范例两个:
http://www.vckbase.com/code/downcode.asp?id=2415
http://www.vckbase.com/code/downcode.asp?id=2397
64 给ListBox控件加上水平滚动条:m_list.SetHorizontalExtent(100); //m_list为和listbox控件绑定的CListBox变量
65 下拉式的工具条按钮:http://community.csdn.net/Expert/topic/4413/4413094.xml?temp=.2334864
66 如何让MFC基于Dialog的程序在任务栏中显示:http://community.csdn.net/Expert/topic/4413/4413492.xml?temp=.3407404
67 制作一个没有标题栏.菜单栏和工具栏的视窗,就象游戏界面一样:
http://community.csdn.net/Expert/topic/4396/4396239.xml?temp=.568783
68 为何组合框Droplist风格时响应键盘PreTranslateMessage函数,而dropdown风格时不响应:
http://community.csdn.net/Expert/topic/4412/4412791.xml?temp=.8741419
69 直接用特殊字符的编码:s=WCHAR(0x00e6); //还没试过
70 在标题栏上画图:http://community.csdn.net/Expert/topic/4416/4416434.xml?temp=.8910944
71 如何精确延时:http://www.vckbase.com/document/viewdoc/?id=1301
72 怎样给TreeView控件中的结点重命名:http://community.csdn.net/Expert/topic/4409/4409069.xml?temp=.1730463
73 从内存中加载并启动一个exe :http://community.csdn.net/Expert/topic/4418/4418306.xml?temp=.7619135
74 修改一个EXE的资源:http://community.csdn.net/Expert/topic/4420/4420755.xml?temp=.5104029
75 使用并显示64bit数值的方法:
__int64 ld = 2000000000*4500000000; //64bit数的范围:-9223372036854775808~+9223372036854775807
printf("%I64d/n",ld);
76 在程序中使用console窗口显示:http://www.codeguru.com/Cpp/W-D/console/
在里面找一下:Redirection
77 用代码画鼠标图案并限定鼠标移动区域(用ClipCursor函数):
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/cursors/usingcursors.asp
78 改变编辑框字体的大小:http://community.csdn.net/Expert/topic/4389/4389148.xml?temp=.2317163
先在对话框类的内部声明一个CFont对象,如:CFont myfont;
---------------------------------
myfont.CreatePointFont(500, "Arial");
GetDlgItem(IDC_EDIT1)->SetFont(&myfont);
---------------------------------
79 bmp图片怎么转换为jpg:
用cximage
www.codeproject.com上有
80 字符串转成UTF-8格式参考CSDN上的FAQ:http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=191432
81 将16进制字符串转换成10进制整数:
char a[3]="ab";
DWORD val = strtoul(a, NULL, 16);
82 快速从数字的字符串中提取出特定长度的数字:
-------------------------------------------------------
int a[4];
sscanf("2004115819185","%07d%02d%02d%02d",&a[0],&a[1],&a[2],&a[3]); //按指定长度分隔
--------------------------------------------------------
或:
-------------------------------------------------------
CString s="aaa,bbb,ccc,ddd";
char a1[4],a2[4],a3[4],a4[4]; //这里要注意多留点空间以存放各子串的长度
sscanf(s,"%[^,],%[^,],%[^,],%[^,]",a1,a2,a3,a4); //按指定字符(这里是逗号)分隔
AfxMessageBox(a4);//显示ddd
-------------------------------------------------------
83 配置文件的配置项可不可以删除:http://community.csdn.net/Expert/topic/4402/4402346.xml?temp=.4008448
84 如何改变CListCtrl包括Scrollbars和Column Headers的颜色和风格:http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/print.php/c4185/
85 根据ComboBox加入的字符串的长度自动调整ComboBox控件的宽度:
//这里假设为ComboBox加入两个字符串
CString str1="中华人民共和国中华人民共和国",str2="1234567890123中国89012345678";
m_combo.AddString(str1); //m_combo为绑定在组合框控件的变量
m_combo.AddString(str2);
int len=str1.GetLength()*6.2; //根据加入的字符串长度(以字节为单位)和组合框使用的默认字体的大小计算组合框实际需要的宽度,计算中间用到了整数->浮点数->整数的两次数值类型隐式转换,也可以用winAPI函数GetTextExtentPoint32()或GetTextExtent计算
m_combo.SetDroppedWidth(len);
86 弹出U盘:http://community.csdn.net/Expert/topic/4432/4432968.xml?temp=.8724634
87 往另一个程序的编辑框中发送文字:句柄->SendMessage(WM_SETTEXT,strlen(buf),(LPARAM)buf); //buf为你要加入的char*
88 如何在RichEdit中加超链接:http://community.csdn.net/Expert/topic/4434/4434686.xml?temp=9.524173E-02
89 VC控件的用法:http://www.vckbase.com/document/indexold.html
90 学习资源:http://code.ddvip.net/list/sort000081_1.html
91 在初始时候定位到LIST的指定行(如第100行)开始显示:EnsureVisible(100) //未验证
92 如何在app中SetTimer():http://community.csdn.net/Expert/topic/4437/4437002.xml?temp=6.014651E-02
http://search.csdn.net/Expert/topic/1422/1422546.xml?temp=.5501825
93 一个基于SDK的软键盘的范例,可以学习如何发送虚拟按键或鼠标消息:http://www.codeproject.com/cpp/togglekeys.asp
94 MDI文档中的字体、及其颜色怎么设置:http://community.csdn.net/Expert/topic/4396/4396003.xml?temp=.7866938
95 自己捕捉特定的组合键:http://community.csdn.net/Expert/topic/4439/4439270.xml?temp=.7411157
http://community.csdn.net/Expert/topic/4484/4484120.xml?temp=.3993799
--------------------------------------------------------------
BOOL CMMDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
BOOL b = GetAsyncKeyState(VK_CONTROL) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(VK_MENU) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(65) >> ((sizeof(short) * 8)-1); //这里不分大小写
if(b)
{
AfxMessageBox("你按下了Ctrl+Alt+A组合键。") ;
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
-------------------------------------------------------------
另外,GetAsyncKeyState和::GetKeyState这两个函数也可以帮你检测Shift、Ctrl和Alt这些键的状态。
96 快速从得到的全路径文件名中分离出盘符、路径名、文件名和后缀名:
------------------------------------------------
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
GetModuleFileName(0,path_buffer,_MAX_PATH);
_splitpath( path_buffer, drive, dir,fname , ext); //用这个函数转换
------------------------------------------------
97 如何debug除零错误:http://community.csdn.net/Expert/topic/4440/4440273.xml?temp=.2427484
98 修改VS.net“工具”栏中菜单的默认图标:http://www.codeproject.com/dotnet/vsnet_addin_icon_change.asp
99 在窗口的标题栏和菜单栏上象realplayer那样添加自己的logo:http://www.codeproject.com/menu/menuicon.asp
100 个性化的位图菜单,自己从CMenu派生子类实现:http://www.codeguru.com/Cpp/controls/menu/bitmappedmenus/article.php/c165
http://www.codeguru.com/Cpp/controls/menu/bitmappedmenus/article.php/c163
101 怎样取得程序自己占用的内存和CPU占用率:GetProcessMemoryInfo和GetPerformanceInfo
102 如何让你的程序运行在release模式下:build->set active configuration
103 监视文件夹是否被更新:FindFirstChangeNotification、FindNextChangeNotification、FindCloseChangeNotification这三个函数
范例见:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/obtaining_directory_change_notifications.asp
105 动态菜单:http://community.csdn.net/Expert/topic/4441/4441893.xml?temp=.2887384
http://community.csdn.net/Expert/topic/4506/4506791.xml?temp=.2409326
106 如何获取客户区的中心坐标:http://community.csdn.net/Expert/topic/4449/4449444.xml?temp=8.642215E-02
107 强行操作内存虚拟地址中某个指定地方的内容:
----------------------------------------------
int *a=(int*)0x00440000; //这里以访问0x00440000地址为例
cout<<*a<
108 如何响应条码机:http://community.csdn.net/Expert/topic/4453/4453026.xml?temp=.1966516
条码扫描仪主要有三种接口: 1.RS232 2.共用接盘接口 3.USB外设. 对于RS232,需要编程来监视和读取条码; 对于共用接盘接口,条码信息被转换成相应的键盘消息,具有输入焦点的应用程序会收到键盘输入消息,我们以前的做法是做一个全局keyboard Hook或应用程序级别上 keyboard hook, 监视键盘消息,当有连续的键盘消息(在很短的时间内),并且这些键盘字符能构成完成的条码信息,就产生一条自定义消息,通知窗口(向监视程序注册的窗口)条码信息到达,条码机只是相当于一个键盘,所以你也可以在界面上放一个edit框,条码机读出条码后还会在字符串后面加一个回车(这个一般是可设置的,可加可不加),如果条码机自动加回车,则你重写OnOK函数,将edit框的内容取出放入list即可。
当然也可不放edit框,而直接接收键盘字符(比如重写OnChar函数等,方法很多),但要考虑到这种情况:条码读不出来的情况,此时应该用手动输入条码,所以还是放一个edit框为好。
109 检查指定文件夹是否存在:PathIsDirectory()
方法一:
检查给定路径是否根目录:BOOL PathIsRoot(LPCTSTR pPath);
说明:Returns TRUE for paths such as “/”, “ X:/”, “// server/ share”, or “// server/”。Paths such as “../path2” will return FALSE.
用这两个函数要先:#include
再把这个文件加入工程:shlwapi.lib
方法二:
GetFileAttributes检查文件是否存在,并且检查是否文件夹属性FILE_ATTRIBUTE_DIRECTORY
----------------------------------------------------------
DWORD = GetFileAttributes(_T("f://win98"));
if(dwAttr != 0xFFFFFFFF && (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
cout<<"exist"<
cout<<"NOT exist"<
方法三:
用下面第113条的_access函数同样可以
----------------------------------------------------------
if(_access("f://win98",0)!=-1)
cout<<"exist"<
cout<<"NOT exist"<
方法四:
用PathFileExists函数,见MSDN介绍,需要的条件同方法一。
还有一个:BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl,LPTSTR pszPath);
Converts an item identifier list to a file system path.
110 去掉单文档标题栏上的“无标题—”:http://community.csdn.net/Expert/topic/4454/4454093.xml?temp=.2896997
111 打开显示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, -1); //从bobob的blog上抄来的^_^
关闭显示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, 1); //从bobob的blog上抄来的^_^
得到它的工作状态:
休眠状态是指用SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1)关闭的
--------------------------------------------------------------------------------
The GetDevicePowerState function is supposed to retrieve the current power state of the specified device. However, Apps may fail to use GetDevicePowerState on the display, as they can't get a handle on "//./Display#", while the # index is 1-based, or "//./LCD", for security reasons.
If you are trying to do this on Windows XP, then you can use SetupDiGetDeviceRegistryProperty and Property: SPDRP_DEVICE_POWER_DATA to get the power management information. This is documented in the Windows XP DDK.
The WMI Class Win32_DesktopMonitor does not report the power state. use SPI_GETPOWEROFFACTIVE or DeviceIOControl with IOCTL_VIDEO_GET_POWER_MANAGEMENT will simply reports power management is enabled or not. SPI_GETPOWEROFFACTIVE just determines whether the power-off phase of screen saving is enabled or not.
BTW, you can always use the SetThreadExecutionState or other APIs (you have used) to switch ON the monitor no matter the monitor is in the ON or OFF state.
References
http://msdn.microsoft.com/library/en-us/Display_r/hh/Display_r/VideoMiniport_Functions_b47b2224-5e0b-44af-9d04-107ff1299381.xml.asp
http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_desktopmonitor.asp
112 得到系统时间、语言等的设置
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITIME, lpLCData, cchData); //从bobob的blog上抄来的^_^
113 文件是否存在(记得先包含头文件#include
----------------------------------
if(_access("c://somefile.txt",0)!=-1)
//存在
else
//不存在
---------------------------------
还有一个方法:
---------------------------------------------
if(GetFileAttributes("f://test.txt")!=0xFFFFFFFF)
{
//存在
}
else
{
//不存在
}
---------------------------------------------
114 得到剪贴板数据
-------------------------------------------------
if ( OpenClipboard() )
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData); //剪贴板中的文本内容保存在buffer中
GlobalUnlock(hData);
CloseClipboard();
}
----------------------------------------------
115 在CStatic上面关联图片
----------------------------------------------
CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC);
pWnd->ModifyStyle(0, SS_BITMAP);
pWnd->SetBitmap((HBITMAP)::LoadImage(0,
"c://zzzzz.bmp", //只能显示.bmp文件
IMAGE_BITMAP,
0,0,LR_CREATEDIBSECTION |LR_DEFAULTSIZE |LR_LOADFROMFILE));
----------------------------------------------
116 显示一个打开文件夹的对话框,并得到用户选择的目录:
-------------------------------------------
char szDir[MAX_PATH];
BROWSEINFO bi;
ITEMIDLIST *pidl;
bi.hwndOwner = this->m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDir;
bi.lpszTitle = "请选择目录";//strDlgTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
pidl = SHBrowseForFolder(&bi);
if(pidl == NULL)
return;
if(!SHGetPathFromIDList(pidl, szDir))
return;
AfxMessageBox(szDir); //szDir中存放的内容为用户选定的目录
------------------------------------------------
117 去除字符串中指定的字符:
-----------------------------------------
CString strtemp;
strtemp.Format("%s","abc/n123/ndef");
strtemp.Remove('/n'); //这里以去除换行符为例,结果保存在strtemp中了
-------------------------------------------
118 有关数据结构的地址:http://student.zjzk.cn/course_ware/data_structure/web/main.htm
119 假如当前时间2005-09-09,如何计算在该时间前12345天,是哪年哪月哪日?
---------------------------
CTime tm(2005,9,9,0,0,0);
tm-=86400*12345;
cout<
120 PeekMessage是干什么用的: http://community.csdn.net/Expert/topic/4462/4462828.xml?temp=.8852045
121 拖动控件时实现类似windows拖动窗口的效果:CRectTracker
Mackz朋友的blog中有它的范例:http://blog.csdn.net/Mackz/archive/2005/10/27/517747.aspx
122 有关UNICODE、ANSI字符集和相关字符串操作的总结:http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=199372
123 寻找系统中的打印机:EnumPrinters
124 用代码加入外部模块的方法:#pragma comment(lib,"mylib.lib")
125 判断指定点是否在一个矩形框内:CRect::PtInRect(POINT point)
126 winAPI 函数GetTextExtentPoint32()可以得出一个以像素为单位的字符串的宽度。
127 RGB转换成YV12(YUV 4:2:0)的方法:http://www.fourcc.org/fccyvrgb.php
128 获得指定进程占用内存的情况,用GetProcessMemoryInfo()函数。
129 把CONSOLE程序的输出导入到文件中,用程序控制:http://community.csdn.net/Expert/topic/4403/4403431.xml?temp=.7469599
http://www.codeproject.com/dialog/quickwin.asp
130 把CRichEditCtrl中的文字保存到rtf文件:http://community.csdn.net/Expert/topic/4478/4478640.xml?temp=.1313135
在codeproject上还有从CRichEditCtrl类派生新类的,功能增强了很多:http://www.codeproject.com/richedit/autoricheditctrl.asp
还有一个开发类似写字板那样程序的完整范例:http://www.codeproject.com/tools/simplewordpad.asp
131 MFC中使用ATL字符转换宏:在你的函数开关加上USES_CONVERSION;语句,详见MSDN或这里:http://community.csdn.net/Expert/topic/4479/4479609.xml?temp=.6256983
132 如何建立共享目录:直接调用标准的Win32API函数NetShareAdd和NetShareDel
详见MSDN及:http://community.csdn.net/Expert/topic/4481/4481371.xml?temp=.4405023
133 位图文件读写基础:http://www.vckbase.com/document/viewdoc/?id=674
134 用VC实现支持多语言的程序:http://www.vckbase.com/document/viewdoc/?id=1102 //还没试过,以后用到了再仔细研究吧
135 Menu系列函数:
GetMenu
GetMenuInfo
GetMenuItemCount
GetMenuItemID
GetMenuString
EnableMenuItem
CheckMenuItem
ModifyMenu
RemoveMenu
InsertMenu
GetSystemMenu
::LoadMenu
::SetMenu
136 得到SYSTEMMENU(系统菜单)的高度:GetSystemMetrics(SM_CYMENU);
得到当前屏幕分辨率:
GetSystemMetrics(SM_CXFULLSCREEN); //得x值(如1024)
GetSystemMetrics(SM_CYFULLSCREEN); //得y值( 如768-任务栏高度)
此外这个函数还可以得到很多别的系统设置值,详见MSDN:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.asp
137 在属性页控件的标签上加图片:http://www.codeguru.com/cpp/controls/propertysheet/article.php/c611/
http://community.csdn.net/Expert/topic/4492/4492593.xml?temp=.9977991
--------------------------------------------------
BOOL CMyPropSheet::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
m_imageTab.Create( IDB_TABIMAGES, 13, 1, RGB(255,255,255) );
CTabCtrl *pTab = GetTabControl();
pTab->SetImageList( &m_imageTab );
TC_ITEM tcItem;
tcItem.mask = TCIF_IMAGE;
for( int i = 0; i < 3; i++ )
{
tcItem.iImage = i;
pTab->SetItem( i, &tcItem );
}
return bResult;
}
----------------------------------------------------
138 这里有很多CRichEditCtrl控件的高级用法:http://www.codeguru.com/Cpp/controls/richedit/
139 CGridCtrl控件的一些应用:http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=327
140 一个不错的地方:http://www.vckbase.com/document/listdoc.asp?mclsid=3&sclsid=323
141 怎样使右键菜单也能变灰、打勾:http://community.csdn.net/Expert/topic/4501/4501123.xml?temp=.4074823
142 MD5加密解密的API:http://community.csdn.net/Expert/topic/4502/4502325.xml?temp=.6894647
MD5Init
MD5Final
MD5Update
143 用CBrush::CreateStockObject(HOLLOW_BRUSH);或CBrush::CreateStockObject(NULL_BRUSH);这两个可以创建镂空的画刷。
144 创建不规则窗体:http://www.vckbase.com/document/viewdoc/?id=1345
145 拖动一个没有标题栏的窗体:http://community.csdn.net/Expert/topic/4499/4499796.xml?temp=6.763858E-02
146 屏蔽浏览器中的弹出广告,下面地址中是在ATL中采用BHO服务的方法:http://www.codeproject.com/atl/popupblocker2.asp
CSDN上有个讨论贴:http://community.csdn.net/Expert/topic/4496/4496918.xml?temp=.157284
147 远程线程注入:
http://www.codeproject.com/threads/RmThread.asp
http://www.codeproject.com/library/InjLib.asp
http://www.codeproject.com/win32/Remote.asp
148 CEditView中两个函数的用法:
GetEditCtrl().ModifyStyle (0 , WS_VSCROLL |ES_AUTOHSCROLL |ES_AUTOVSCROLL |WS_HSCROLL |ES_WANTRETURN | ES_MULTILINE);
GetEditCtrl().GetSel(m_nStartChar, m_nEndChar ) ;
149 给对话框窗体底部加上状态条,把下面代码加进对话框的OnInitDialog()函数中:
-----------------------------------------------------------
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
//下面m_wndStatusBar必须先在对话框类中声明:CStatusBar m_wndStatusBar;
if (!m_wndStatusBar.Create(this,WS_CHILD|WS_VISIBLE|WS_BORDER)||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
AfxMessageBox("Status Bar not created!", NULL, MB_OK );
}
CRect rect;
this->GetWindowRect(&rect);
m_wndStatusBar.MoveWindow(2,rect.bottom-GetSystemMetrics(SM_CYSIZE)-27,rect.Width()-4,20);
m_wndStatusBar.ShowWindow(SW_SHOW);
m_wndStatusBar.SetWindowText("Ready");
-----------------------------------------------------------
把上面代码加在OnInitDialog里,注意:m_wndStatusBar变量的声明语句CStatusBar m_wndStatusBar;要放在你的对话框类C****Dlg中才行。
150 从注册表中读取cpu的频率:
读取 ~MHz 这个键值 ,记住那键前有个~别忘了,在注册表的HKEY_LOCAL_MACHINE//Hardware//Description//System//CentralProcessor//0 //0 为第一个cpu
Hardware//Description//System//CentralProcessor//1 //1 为第二个cpu
得到cpu的数量,摘自:http://community.csdn.net/Expert/topic/4635/4635246.xml?temp=.7182123
-----------------------------------------------------------------------
SYSTEM_INFO siSysInfo;
GetSystemInfo(&siSysInfo);
printf(" Number of processors: %u/n", siSysInfo.dwNumberOfProcessors);
-----------------------------------------------------------------------
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);
--------------------------------------------------------------
201 单文档中打印预览,发送消息模拟点击菜单中“打印预览”:
---------------------------------------------------------------------------------
::SendMessage(this->GetSafeHwnd(), WM_COMMAND, ID_FILE_PRINT_PREVIEW, 0);
---------------------------------------------------------------------------------
202 得到当前登陆用户的用户名:GetUserName/GetUserNameEx
203 设置发生改变后系统会自动更新,要善加利用:::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL);
204 拖动一个没有标题栏的窗口:
-----------------------------------------------------------------------
void CMyControl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
UNUSED_ALWAYS(nFlags);
if (!(GetWindowLong(m_hWnd, GWL_STYLE) & WS_CHILD))
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
else
GetParent()->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
}
-----------------------------------------------------------------------
205 用指定字体在dc中写字:
-------------------------------------------------------
HDC hdc = ::GetDC(NULL);
HFONT hfont,holdfont;
hfont = (HFONT)GetStockObject(OEM_FIXED_FONT);
holdfont = (HFONT)SelectObject(hdc,hfont);
TextOut(hdc,10,50,"/1/2/3/4",8);
SelectObject(hdc,holdfont);
DeleteDC(hdc);
-------------------------------------------------------
206 桌面主题更改的消息:WM_THEMECHANGED
207 修改菜单项的名称:
CMenu *pMenu = AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
pMenu->ModifyMenu(0,MF_BYPOSITION,0,"Test");
208 __LINE__表示本行代码在程序中第几行,同样:__FILE__表示当前文件的全路径
----------------------------------
CString str;
str.Format("Line is %d", __LINE__); //指这行
AfxMessageBox(str);
----------------------------------
209 查看系统函数的源代码的方法:装一个Visual Assist X,想看某个函数的时候ALT + G
210 一直以来,想实现窗口透明程度不同,或局部透明,局部不透明,但这也只是梦想,下面这个函数看来可以让我们梦想成真:UpdateLayeredWindow
211 LOGFONT各成员的意义:
---------------------------------------------------------------------------------
LOGFONT lf;
lf.lfHeight=-80; //字体字符的高度
lf.lfWidth=0; //字符平均宽度
lf.lfEscapement=45; //文本行逆时针旋转45度
lf.lfOrientation=0; //字符角度
lf.lfWeight=FW_HEAVY; //字符的粗细度
lf.lfItalic=FALSE; //倾斜
lf.lfUnderline=FALSE; //下划线
lf.lfStrikeOut=FALSE; //删除线
lf.lfCharSet=GB2312_CHARSET; //中文字符集
lf.lfOutPrecision=OUT_STROKE_PRECIS; //字体输出结果和要求的匹配程度
lf.lfClipPrecision=CLIP_STROKE_PRECIS; //如何裁剪落于裁剪区之外的字符
lf.lfQuality=DRAFT_QUALITY; //字体属性匹配的精确程度
lf.lfPitchAndFamily=VARIABLE_PITCH | FF_MODERN; //字体间距和字体族
strcpy(lf.lfFaceName,"楷体_GB2312"); //楷体
m_font.CreateFontIndirect(&lf); //m_font为类的成员变量:CFont m_font;
---------------------------------------------------------------------------------
212 指向指象主对话框的指针:AfxGetApp()->m_pMainWnd或AfxGetApp()->GetMainWnd()
213 去除F1的帮助功能,重载WM_HELPINFO消息:
------------------------------------------------------
BOOL CYourdlgDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
return TRUE;//CDialog::OnHelpInfo(pHelpInfo);
}
------------------------------------------------------
214 串口(包括USB转串口)几个小问题:http://community.csdn.net/Expert/topic/4470/4470922.xml?temp=.9018061
215 控制输入法相关的几个函数:ImmGetContext、ImmGetConversionStatus、ImmSetConversionStatus、ImmReleaseContext等
216 限定输出字符的矩形范围:ExtTextOut或DrawText
217 控制滚动条的显示或隐藏:CWnd::ShowScrollBar(UINT nBar,BOOL bShow = TRUE)
218 注册表中:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum下IDE和SCSI分支中枚举所有这两种设备。
219 更改当前时区:SetTimeZoneInformation
获得当前时区:GetTimeZoneInformation
220 直接读取硬盘的指定扇区:
(1)用汇编;
(2)直接用CreateFile("//./PHYSICALDRIVE0", ...)打开物理磁盘设备即可(物理磁盘设备都是从0开始排号的,0表示第一块硬盘,1表示第二块硬盘....),这样用SetFilePointer可以随意读取硬盘上任何位置的东西!至于扇区嘛,一般都是512字节为1扇区的,自己换算就是了~ <===================还没试,不过这里有更多内容:http://www.51cto.com/html/2005/1110/11133.htm
221 获得本机并口的起始地址:
可以读取bios数据区域,当然只能在未进入保护模式的操作系统前或dos下读取
段地址:00H
408H 字 计算机上0号并行打印机适配器的基地址,
40AH 字 计算机上1号并行打印机适配器的基地址。
40CH 字 计算机上2号并行打印机适配器的基地址。
40EH 字 计算机上3号并行打印机适配器的基地址。(PS2型此值为扩展BIOS数据区段地址)
SetupAPI可以得到所有设备的信息包括IO端口,内存资源,中断号码
222 更换桌面背景:
方法一:
看这里:http://www.vckbase.com/vckbase/vckbase10/vc/nonctrls/atlcomocx_02/1002001.htm,用了com中IActiveDesktop,这是个活动桌面的COM接口,还有智能指针,可以顺便学习一下这方面内容;
方法二:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c://aa.bmp", 1); //jpg图片不行,无法显示
223 让多行风格的编辑框控件显示指定行又一法:m_txt.LineScroll(m_txt.GetLineCount()); //m_txt为CEdit控件绑定变量
224 控制音量API:waveOutSetVolume
225 在程序运行期间,怎样禁止窗口右上方的关闭按钮
---------------------------------------------------------------
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ;
// 变为非禁止状态
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_ENABLED) ;
---------------------------------------------------------------
226 请问如何让SDI程序启动时自动隐藏:http://community.csdn.net/Expert/topic/4602/4602225.xml?temp=.1871607
http://blog.csdn.net/enoloo/archive/2004/06/07/17638.aspx //这个是要最大化的
把pMainFrame->ShowWindow(SW_HIDE);这句加在ParseCommandLine(cmdInfo);的后面,if (!ProcessShellCommand(cmdInfo))的前面
227 经常有人问有没有高效的方法,可以知道一个文本文件有多少行,抽空写了几行代码回复在贴子中:http://community.csdn.net/Expert/topic/4601/4601972.xml?temp=.5953943
228 精确的计时: <========================还没试
__int64 lfreq;
BOOL bret=QueryPerformanceFrequency((LARGE_INTEGER*)&lfreq);
__int64 lstart;
QueryPerformanceCounter((LARGE_INTEGER*)&lstart);
//... call your function
__int64 lstop;
QueryPerformanceCounter((LARGE_INTEGER*)&lstop);
__int64 lruntime=lstop - lstart;
double dsec= lruntime/lfreq;
229 命令行处理的封装类CCommandLineInfo和CCommandLineInfoEx
230 操作临时文件,临时文件的使用方法基本与常规文件一样,只是文件名应该调用函数GetTempFileName()获得。它的第一个参数是建立此临时文件的路径,第二个参数是建立临时文件名的前缀,第四个参数用于得到建立的临时文件名:
-----------------------------------------
char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];
GetTempPath(_MAX_PATH, szTempPath);
GetTempFileName(szTempPath,_T("my_"),0,szTempfile);
-----------------------------------------
231 弹出USB设备安全删除对话框:WinExec("C://WINDOWS//system32//rundll32.exe shell32.dll,Control_RunDLL hotplug.dll",SW_SHOW);
232 弹出“数据链接属性”对话框:IDataSourceLocatorPtr::PromptNew();
233 ActiveSkin 4.3 软件换肤在VC中的实现:http://www.vckbase.com/document/viewdoc/?id=1288
234 CBitmap=====>HBITMAP:
-------------------------------------------------------------------------------------
CBitmap bitmap;
HBITMAP hbitmap=(HBITMAP)bitmap; //CBitmap中重载了HBITMAP()操作符,可以方便地用它来强制转换
-------------------------------------------------------------------------------------
HBITMAP=====>CBitmap:
---------------------------------------
HBITMAP hbitmap;
CBitmap bitmap;
bitmap.FromHandle(hbitmap);
---------------------------------------
235 从其它.exe文件提取.ico图标作为自己程序的图标:
----------------------------------------------------------------------
HINSTANCE hInst = LoadLibrary("b.exe");
HRSRC hRc = FindResource(hInst, (LPCSTR)1, (LPCSTR)RT_ICON);
LPVOID lpResource = LockResource(LoadResource(hInst,hRc));
HANDLE hUpdate = BeginUpdateResource("a.exe", FALSE);
UpdateResource(hUpdate, (LPCSTR)RT_ICON, (LPCSTR)1, 0, lpResource, SizeofResource(hInst, hRc));
EndUpdateResource(hUpdate, FALSE);
CloseHandle(hRc);
FreeLibrary(hInst);
-----------------------------------------------------------------------
236 得到当前屏幕的参数,最好是用函数EnumDisplaySettings(其它的方法如:GetSystemMetrics(SM_CYFULLSCREEN);会因为任务栏是否隐藏而可能得不到真实高度),这个函数功能强大,可根据指定的设备名(第一个参数)返回它的显示信息:
-------------------------------------------------------------------------------
CString strCurrentDifferency,strCurrentColorMode; //分别用来存放屏幕当前分辨率、色彩位数的字符串
LPDEVMODE gpCurrentMode = new DEVMODE; //用来存储屏幕当前设置的结构指针
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, gpCurrentMode); //获得当前分辨率的大小和其它信息
strCurrentDifferency.Format("分辨率:%d*%d",gpCurrentMode->dmPelsWidth,gpCurrentMode->dmPelsHeight);
strCurrentColorMode.Format("当前颜色位数:%d",gpCurrentMode->dmDisplayFrequency);
AfxMessageBox(strCurrentDifferency);
AfxMessageBox(strCurrentColorMode);
delete gpCurrentMode;
gpCurrentMode=NULL;
--------------------------------------------------------------------------------
用CDC::GetDeviceCaps函数也可以:
-------------------------------------------------------------------------------------------------------
CString strCurrentDifferency;
CDC *pDC=CDC::FromHandle(::GetDC(0)); //随便获得一个DC指针就可以了,这里是获得桌面的DC
strCurrentDifferency.Format("分辨率:%d*%d",pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));
AfxMessageBox(strCurrentDifferency);
-------------------------------------------------------------------------------------------------------
237 组合框控件在Dropdown类型时,如何设置其为只读的:
-----------------------------------------------------------------------------
CComboBox *pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
HWND hEdit = ::FindWindowEx(pCombo->GetSafeHwnd(), NULL, _T("EDIT"), NULL);
if (hEdit)
::SendMessage(hEdit, EM_SETREADONLY, TRUE, 0);
-----------------------------------------------------------------------------
238 解决这个工程出现重复编译的错误:http://community.csdn.net/Expert/topic/4610/4610652.xml?temp=.9251825
239 侦测计算机是否连上网络:InternetGetConnectedStateEx
240 枚举软件或硬件设备:IMDServiceProvider::EnumDevices
241 对话框中控件内容的打印:http://community.csdn.net/Expert/topic/4609/4609829.xml?temp=.1613275
使你的dialog支持打印预览:http://www.codeproject.com/printing/#Print+Preview
http://www.codeproject.com/listctrl/listprintdemo.asp
现在没有打印机可试,记在这里先,以后有了再测试。
242 结束其它的进程:GetWindowThreadProcessId和TerminateProcess函数,不过TerminateProcess尽量少用,它可以直接结束目标进程,目标进程死都不知道是自己怎么死的,来不及保存自己的数据结果,也来不及通知自己所调用的.dll文件不用给自己做晚饭了,当然也来不及打电话给它的子进程说:“阿珍,其实我一直都想对你说:我爱你!”
这里还有个贴子:http://community.csdn.net/Expert/topic/4608/4608816.xml?temp=.9869654
243 用LockFile函数锁定一个打开文件的某一个区域,可以防止其它进程访问该区域。
244 使CListCtrl控件的Item标签可以修改:ModifyStyle(0,LVS_EDITLABELS);
245 如何动态的改变菜单项在状态栏中的提示:http://community.csdn.net/Expert/topic/4615/4615363.xml?temp=2.514064E-03
重载CFrameWnd的virtual void GetMessageString(UINT nID, CString& rMessage) const;函数
实现:
--------------------------------------------------------------------------------
void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
{
if(nID == ID_FILE_NEW) //这里可以动态改变
{
rMessage = "Create new file!";
return;
}
CFrameWnd::GetMessageString(nID,rMessage); //调用默认的处理过程
}
--------------------------------------------------------------------------------
对话框工程中:
Handle the WM_MENUSELECT message. The wParam is the menu index, which is also the index of the stringtable entry that describes the menu. This prompting is ordinarily handled by the mainframe, but in a dialog-based app you have to add your own handler
246 修改.exe或其它模块的资源,参考下面几个函数: <===========没试过,不过看上去可行,用到时再试吧^_^
LoadLibrary
FindResource
LoadResource
LockResource
BeginUpdateResource
UpdateResource
EndUpdateResource
FreeResource
具体见MSDN,上面同时给出了调用顺序,看了参数就明白了
247 请问NULL和null,TRUE和true,FALSE和false等有啥区别?
1.FALSE/TRUE与false/true的区别:
false/true是标准C++语言里新增的关键字,而FALSE/TRUE是通过#define,这要用途是解决程序在C与C++中环境的差异,以下是FALSE/TRUE在windef.h的定义:
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
也就是说FALSE/TRUE是int类型,而false/true是bool类型;所以两者不一样的,只不过我们在使用中没有这种感觉,因为C++会帮你做隐式转换。
2.bool的大小与BOOL的区别:
bool在C++里是占用1字节,而BOOL是int类型,int类型的大小是视具体环境而定的;所以来说:false/true只占用1个字节,而TRUE/FALSE视具体环境而言
248 CFile::GetStatus也可以获得文件的属性信息
249 获取桌面所有顶级窗口:EnumDesktopWindows、EnumWindowsProc
250 显示用DirectShow捕捉下来的视频:
DirectShow的 IVideoWindow可以设置
---------------------------------------------------------------------
IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pVidWin);
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
RECT grc;
GetClientRect(hwnd, &grc);
pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);
---------------------------------------------------------------------
251 改变编辑框控件中光标的图形:
----------------------------------------------------------
CBitmap* pBitmap = new CBitmap;
pBitmap->LoadBitmap(IDB_HAPPY_BITMAP); //IDB_HAPPY_BITMAP为工程中.bmp资源,大小任意,但颜色超过16色的话色彩会失真
m_editCtrl.CreateCaret(pBitmap); //m_editCtrl为编辑框控件变量
POINT point;
point.x=0;
point.y=0;
m_editCtrl.SetCaretPos(point); //改变光标的位置,以像素为单位
m_editCtrl.ShowCaret();
----------------------------------------------------------
252 用主题函数改变对话框窗口的可视风格(MSDN上可查到更多这方面的函数):
----------------------------------------------------------------
#include
#pragma comment(lib,"uxtheme.lib")
void CMyDlg::OnTest()
{
EnableThemeDialogTexture(m_hWnd,ETDT_ENABLE | ETDT_USETABTEXTURE);
Invalidate();
}
----------------------------------------------------------------
253 如何让MDI程序在启动的时候不新建子窗口:http://community.csdn.net/Expert/topic/4619/4619802.xml?temp=.2809107
在App的InitInstance中加一行:
--------------------------------------------------------
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing; //添加这一句
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
--------------------------------------------------------
254 关机:ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0 ) <=====还没试
强制关机ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0 );
255 hook:http://community.csdn.net/Expert/topic/4615/4615606.xml?temp=.7596094
256 字符串====>日期时间:
-------------------------------------------------
COleDateTime dt;
dt.ParseDateTime(_T("2006-2-14 8:00:00"));
SYSTEMTIME st={0};
dt.GetAsSystemTime(st);
//SetLocalTime(&st); //设置电脑中时间
-------------------------------------------------
日期时间====>字符串:
-------------------------------------------------
SYSTEMTIME st={0};
st.wYear=2006;
st.wMonth=3;
st.wDay=23;
st.wHour=8;
st.wMinute=30;
st.wSecond=59;
COleDateTime dt(st);
AfxMessageBox(dt.Format());
-------------------------------------------------
257 typeid函数可以判断一个对象的类型,详见MSDN,上面有示例代码,不过有点小问题:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_typeid_operator.asp
258 系统休眠,摘自:http://community.csdn.net/Expert/topic/4637/4637403.xml?temp=.8914301
------------------------------------------------------------------------------------------------
if(MessageBox("确实要休眠吗?","关机程序",MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION)==IDYES)
{
static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
if(::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
tp.PrivilegeCount=1;
tp.Privileges[0].Luid =luid;
tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken,false,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
}
::SetSystemPowerState(false,true);
}
-------------------------------------------------------------------------------------------------
259 在录音时如何控制录音属性中麦克风或者线路输入的音量
1.mixerGetNumDevs获取混音设备数量
2.循环获取设备信息mixerOpen/mixerGetLineInfo
3.根据获得的MIXERLINE中dwComponentType判断类型来确定是线入/麦克风
MIXERLINE_COMPONENTTYPE_SRC_LINE/MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
4.mixerSetControlDetails设置音量
260 用资源管理器打开指定文件夹,并置目标文件夹为选定状态:WinExec("explorer /n,/select,f://win98", SW_SHOWNORMAL );
261 打开或关闭输入法:IActiveIME::SetActiveContext
262 提取.exe或.dll文件中的图标:ExtractIcon
263 捕捉其他程序最大、最小化消息:http://community.csdn.net/Expert/topic/4647/4647630.xml?temp=.8477289
264 WM_DEVICECHANGLE消息配合DeviceIoControl函数可禁用U盘
265 判断编辑框控件是否为只读的:
----------------------------------------------------
CEdit *temp=(CEdit *)GetDlgItem(IDC_EDIT1);
DWORD a=temp->GetStyle();
if(a & ES_READONLY) //ES_READONLY=0x800
AfxMessageBox("Read only");
else
AfxMessageBox("NOT read only");
----------------------------------------------------
266 获得系统电源状态:
GetSystemPowerStatus
Retrieves the power status of the system. The status indicates whether the system is running on AC or DC power, whether the battery is currently charging, and how much battery life remains.
267 桌面元素的操作:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/activedesktop.asp
268 如何判断是键盘左边的Shift还是右边的Shift键,摘自:http://community.csdn.net/Expert/topic/4661/4661661.xml?temp=8.190554E-02
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/virtualkeycodes.asp
上面URL中MSDN给出了所有按键的ASCII码。
VK_LSHIFT (A0)
Left SHIFT key
VK_RSHIFT (A1)
Right SHIFT key
269 C++开发常用工具:http://blog.vckbase.com/FlowSand/archive/2006/01/27/17447.html
270 sprintf中打印百分号%的方法,摘自:http://blog.vckbase.com/smileonce/archive/2006/03/16/18521.html
------------------------------------------------------------
int percent = 50;
char buf[100];
sprintf(buf, "%d%%%% complete/n! ", percent);
printf(buf); //这样就只打印一个%了
printf("%s",buf); //改成这样后打印出两个%了,恰如我们期望的
------------------------------------------------------------
271 精确延时,KeStallExecutionProcessor函数来帮你,摘自:http://blog.vckbase.com/zaboli/archive/2006/03/24/18705.html
但是问题是KeStallExecutionProcessor的文档说,他的最小周期不能大于 50微秒!不然会造成系统停顿。。
测试得出 KeStallExecutionProcessor(416)在有的机器上会造成鼠标停顿 -_-但是KeDelayExecutionThread(KernelMode, FALSE, &WaitTime); 无论再怎么设置小的超时,结果都如下10毫秒???差太多了吧。。。
272 向控件发送鼠标滚轮的消息:
::SendMessage(m_cListCtrl.m_hWnd,WM_MOUSEWHEEL,(WPARAM)-7864320,0); //参数三是向下滚动的参数,7864320则为向上滚动
273 数日前收到天影朋友的23种设计模式的例子,很浅显易懂。下面的blog中亦有设计模式的探讨,借古喻今,文笔不错,可供参考:
http://blog.csdn.net/junguo/
274 获得文件夹大小的方法,摘自:http://community.csdn.net/Expert/topic/4672/4672088.xml?temp=.2216761
----------------------------------------------------------------------------------
#include
#import "scrrun.dll" raw_interfaces_only
int main()
{
CoInitialize(NULL);
{
try
{
Scripting::IFileSystem3Ptr fs;
fs.CreateInstance(__uuidof(Scripting::FileSystemObject));
Scripting::IFolderPtr folder;
fs->GetFolder(_bstr_t("f://win98"),&folder);
_variant_t vsize;folder->get_Size(&vsize);
cout<<"f://win98 size:"<<(long)vsize<<" bytes"<
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
cout<<"Get directory size via FileSystemObject, by masterz"<
}
CoUninitialize();
return 0;
}
----------------------------------------------------------------------------------
275 打开控制台界面,写点文字在上面:
----------------------------------------------------------------------------------
AllocConsole();//打开控制台窗口
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//得到控制台句柄
unsigned long lgsize;
char *strbuf="显示这行信息。";
WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);
FreeConsole();//关闭释放用于输入新信息的控制台窗口
----------------------------------------------------------------------------------