您的位置:首页 > 编程语言 > C语言/C++

VC++ 笔记

2009-09-17 14:16 169 查看
1.使用ModifyStyleEx改变了控件风格无效
答:修改之后,重绘一次,如果还不行的话,再试试看调用SetWindowPos(0,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME);

2.动态设置编辑框的ES_PASSWORD无效
答:修改之后,需要调用一次SetPasswordChar('*');

3.如何获取任务栏小图标?
答:有网友提出,能不能在程序界面上显示当前的托盘图标,这样更直观一些。这一点我也曾想到过,也知道奥秘就在TBBUTTON这个结构体的dwData域里面,可惜这个域的结构在MSDN中没有描述。我也曾试着发送TB_GETIMAGELIST消息获取image list的句柄,然后用CImageList::FromHandle加载到CImageList中,但却都失败了。
在csdn网友的帮助下,我弄清了dwData的结构,其实dwData有一个这样的机构,我们命名为TRAYDATA:
struct TRAYDATA
{
    HWND hwnd;                 
    UINT uID;               
    UINT uCallbackMessage;     
    DWORD Reserved[2];         
    HICON hIcon;                //托盘图标的句柄
}; 
要获取到这个hIcon,其实很简单:
//分配虚拟内存
lngAddress = VirtualAllocEx(hProcess,  NULL,  sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);   
//将hProcess进程内,地址为lngAddress中的内容(大小为sizeof(TBBUTTON))获取到tb中
ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress)), &tb, sizeof(TBBUTTON), 0);
//将hProcess进程内,地址为tb.dwData中的内容(大小为sizeof(TRAYDATA))获取到tray中
ret = ::ReadProcessMemory(hProcess, LPVOID(tb.dwData), &tray, sizeof(TRAYDATA), 0);
然后就可以用tray.hIcon索引到这个图标句柄了
//释放内存代码略

4.BeginWaitCursor和EndWaitCursor无效
答:SetCapture();BeginWaitCursor();....EndWaitCursor();ReleaseCapture();

5.打印源码中文件名和行号常用的宏名是什么?
答:文件名:__FILE__  行号:__LINE__

6.如何具体判断一个字符串中哪个是英文字母
答:函数isalpha

7.在注册表中如何得到所有安装了的应用程序程序的信息
答:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall下面的子鍵

8.64位系统下运行32的程序,操作注册表遭遇重定向问题
答:PVOID  OldValue;
HINSTANCE  hlibrary;
typedef    int        (__stdcall  *  Wow64DisableWow64FsRedirection)(LPVOID);
YWow64DisableWow64FsRedirection  f_Wow64DisableWow64FsRedirection  =  NULL;
typedef    int        (__stdcall  *  Wow64RevertWow64FsRedirection)(LPVOID);
Wow64RevertWow64FsRedirection  f_Wow64RevertWow64FsRedirection  =  NULL;
hlibrary  =  LoadLibrary("Kernel32.dll");
f_Wow64DisableWow64FsRedirection  =  (Wow64DisableWow64FsRedirection)  GetProcAddress(hlibrary,"Wow64DisableWow64FsRedirection");
if(!f_Wow64DisableWow64FsRedirection) { }
f_Wow64DisableWow64FsRedirection  (&OldValue);
//这里写注册表操作函数,Open的时候要指定  KEY_WOW64_64KEY标志
f_Wow64RevertWow64FsRedirection  =  (Wow64RevertWow64FsRedirection)  GetProcAddress(hlibrary,"Wow64RevertWow64FsRedirection");
if(!f_Wow64RevertWow64FsRedirection) { }
f_Wow64RevertWow64FsRedirection  (OldValue);
FreeLibrary(hlibrary);

9.怎么使用系统默认浏览器在新窗口打开网页
答:ShellExecute是我们常用的一个API,可以运行程序,打开网页。
ShellExecute(NULL,  "open",  "http://www.csdn.net",  NULL,NULL,SW_SHOWMAXIMIZED);
这样可以打开一个网页,但不是在新IE中打开,改成下面方式时就可以在一个新的IE中打开网页了
ShellExecute(NULL,  "open",  "IEXPLORE",  "http://www.csdn.net",NULL,SW_SHOWMAXIMIZED); 

10.怎么清除串口的输入缓冲
答:PurgeComm(hCom,PURGE_TXABORT ¦ PURGE_RXABORT ¦ PURGE_TXCLEAR ¦ PURGE_RXCLEAR);

11.显示桌面属性对话框
答:ShellExecute(GetDesktopWindow()->m_hWnd,"open","control.exe","desk.cpl Display,@Theme","",SW_SHOW );

12.限制Edit只能输入0-F
答:WNDPROC wpOrigEditProc;
LRESULT CALLBACK wpSubclassEditProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam);
wpOrigEditProc = (WNDPROC) SetWindowLong(GetDlgItem(IDC_EDIT_DATA)->m_hWnd,
                GWL_WNDPROC, (LONG) wpSubclassEditProc);
LRESULT CALLBACK wpSubclassEditProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam)
{
switch(uiMsg)
{
case WM_CHAR:
  if((wParam >= 0x30 && wParam <= 0x39) ||
    (wParam >= 0x41 && wParam <= 0x46) ||
    (wParam >= 0x61 && wParam <= 0x66) ||
    (wParam == 0x08) || wParam == 0x20 || wParam == 0x0D)
  {
  return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
  }
  else
  {
  if(GetKeyState(VK_CONTROL) & 0x8000)
  {
    return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
  }
  return true;
  }
  break;
}
return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息