学习VC中所得的点点技术心得2 (转)
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<str.GetLength();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
http://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