您的位置:首页 > 其它

转=vc常见问题收集整理1。。

2009-08-10 20:54 543 查看
laiyiling(【陌生人 V2.0】) 收集整理

问】如何判定剪贴板中有没有文本数据?
答】
COleDataObject dataObject;
dataObject.AttachClipboard();
if(dataObject.IsDataAvailable(CF_TEXT))
{
.....//有文本数据
}
问】如何得到ComboBox的Edit句柄?
答】CEdit *pEdit = (CEdit*)CComboBox.GetWindow(GW_CHILD)
问】得到当前用户目录,即:C:\Documents and Settings\...
答】SHGetSpecialFolderPath(NULL,(LPTSTR)szPath,CSIDL_PERSONAL,FALSE);
问】状态栏的高度怎样改变?
答】m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(40);
问】动态调整控件大小时需要注意的问题
答】
程序在执行WM_SIZE时,可能控件还没有被程序创建完成,你必须确保你的控件被创建后才能使用MoveWindow,
1,你可以设一个BOOL变量,初值为FALSE,在OnInitDialog的最后将它的值变成TRUE,在WM_SIZE中判断这个变量,只有当它为真时才进行MoveWindow操作。
2,你也可经先用::IsWindow(控件.GetSafeHwnd())判断控件是否创建,只有当它为真时才进行MoveWindow操作。
问】在PreTranslateMessage()中如何取得组合键比如CTRL+F1
答】if(pMsg->message ==WM_KEYDOWN&&pMsg->wParam==VK_F1 &&GetKeyState(VK_CONTROL)&0x80)
问】SendMessage PostMessage的区别
答】
PostMessage发送消息后就不等了,发了就回,管你处不处里呢
SendMessage发送消息后还要等消息被处理之后函数才返回
更具体的解释可以看: http://msdn.microsoft.com/msdnmag/issues/1200/c/ 问】文档视图程序怎么使程序开始运行后不打开任何一个文档?
答】
MDI
在程序的InitInstance中的ProcessShellCommand函数之前加入:
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing
SDI
InitInstance函数中关于OnFileNew的调用去掉
问】如何向一个按钮发送单击消息?
答】
SendMessage(WM_COMMAND,((WPARAM)BN_CLICKED)<<8|(WPARAM)IDC_BUTTON,0L);
::PostMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
::SendMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
问】
sdi工程,在关闭窗口的时候总是提示我是否保存?怎么才能不让这个窗口弹出直接关闭呢?
答】
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
GetActiveDocument()->SetModifiedFlag(FALSE); //加入这句!
CFrameWnd::OnClose();
}
问】如何得到其他应用程序的文本内容?
答】发送WM_GETTEXT消息,而不能直接用GetWindowText函数,如果是用SDK,直接把CWnd换为HWND
CWnd* pWnd = GetOtherAppWindow();
TCHAR buf[512];
pWnd->SendMessage(WM_GETTEXT,sizeof(buf)/sizeof(TCHAR),(LPARAM)(void*)buf);
看到这里肯定有人会问?为什么GetWindowText函数不行呢?GetWindowText函数不就是发送WM_GETTEXT消息吗?不是。GetWindowText函数只有在窗口属于当前进程的时候才会发送WM_GETTEXT消息。如果窗口属于不同的进程,GetWindowText函数的行为是不一样的,MSDN的文档说的很清楚:
如果目标窗口是属于其他进程的,并且窗口也有标题栏。GetWindowText函数返回窗口的标题。如果窗口没有标题栏则返回NULL。微软一开始就是这么设计GetWindowText函数的。也就是说我们用GetWindowText函数只能得到其他进程窗口的标题,而不能得到其他进程窗口里子窗口的文本内容,如:编辑矿、组合框。
问】如何获知某进程打开了哪些文件?
答】http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c2827
问】如何用CMyListCtrl(即自定义控件)取代CListView中的控件?
答】I made a custom control derived from CWnd, and now I want to use it as a view. My first solution was to embed the control into the view and handle OnSize in the view to position the control over the client area. The problem is that mouse messages go to the control and cannot be overridden in the view. The keystroke messages go to the view and must be manually forwarded to the control.
I read about CCtrlView as a base class for common controls. I've even managed to write the view around it (I believe that you wrote about this in an issue of MSJ), but I could not get it to work with my CWnd-based control. Can this be done, and how?
更多信息参见 http://msdn.microsoft.com/msdnmag/issues/01/11/c/default.aspx 问】谁能讲讲如何实现API钩子?
答】My motivation for writing this article was the need for a really simple hooking framework, that will offer an easy to use interface and ability to capture different APIs. It intends to reveal some of the tricks that can help you to write your own spying system. It suggests a single solution how to build a set for hooking Win32 API functions on NT/2K as well as 98/Me (shortly named in the article 9x) family Windows. For the sake of simplicity I decided not to add a support for UNICODE. However, with some minor modifications of the code you could easily accomplish this task.
For more infomation please read the following article,更多信息参见 http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5667/ 问】// 激活当前屏幕保护程序可以发送如下消息
答】PostMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);
问】怎样得到屏幕的DC?
答】CDC *dc=CDC::FromHandle(::GetDC(NULL));
问】如何在状态栏里显示汉字?
答】
m_wndStatusBar.SetPaneText(nPane, sMsg);
nPane是格子的序号,从0开始
sMsg是显示的内容
问】TabCtrl响应双击关闭
答】可以用SetWindowLong设置上CS_DBLCLKS属性
问】取得桌面的地址
答】char szPath[1000];
SHGetSpecialFolderPath(this->GetSafeHwnd(),szPath,CSIDL_DESKTOP,false);
问】如何编程修改系统文件的显示属性?
答】直接修改注册表可以。
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
值Hidden,
当这个值为2时,是“不显示隐藏的文件和文件夹”
当这个值为1时,是“显示所有文件和文件夹”
问】如何判断一个是否正被使用?
答】
HANDLE hf = CreateFile(cName,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if(hf==INVALID_HANDLE_VALUE)
{
messageBox("该文件正在被使用,请关闭部分程序在试");
return;
}
CloseHandle(hf);
问】调试命令行参数程序时怎么输入参数?
答】
Project | Seeting | Debug
Program arguments中输入你的参数
问】关于组合框的属性
答】
如果组合框具有不可输入只能下拉选择属性(DROPLIST),则直接关联的成员变量只能是int类型,你需要GetLBText()函数来获取当前选择的文本。(这是我们使用组合框时情况最多的一种)
如果组合框除了下拉选择外还可以输入字符串(DropDown),则只能直接关联CString类型的成员变量。要获取当前选择的序号需要自己构造函数来完成

ComboBox下拉框的可视长度是指在create的时候指定的rect高度,就是combox下拉框的高度。
问】如何编程打开关闭显示器?
答】
SendMessage(hWnd, WM_SYSCOMMAND,SC_MONITORPOWER,-1); //打开显示器
SendMessage(hWnd, WM_SYSCOMMAND,SC_MONITORPOWER,1); //关闭显示器问】如何控制系统任务栏的显示和隐藏?
答】
//隐藏WINDOWS系统任务栏
::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
//恢复WINDOWS系统任务栏正常显示
::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW);
问】如何去掉树控件水平滚动条?
答】long style = GetWindowLong(Handle,GWL_STYLE);
style |= TVS_NOHSCROLL;
SetWindowLong(Handle,GWL_STYLE,style);
::ShowWindow(hwnd,SW_HIDE);
问】怎样在CFormView去掉滚动条?
答】
在OnInitialUpdate函数里边,用下面的语句就OK了,
SetScrollSizes(MM_TEXT,CSize(0,0))
问】
CRuntimeClass 的 m_pNextClass如何使用,我添加一个从CObject继承的类,实现了序列化,但是得到改类的CRuntimeClass 的m_pNextClass为空,为什么?
有没有给定一个类的字符串名字,比如 "CMyObj",
通过CRuntimeClass *pClass = RUNTIME_CLASS(CMyObj);pClass->CreateObject();创建对象.注意"CMyObj" 与CMyObj不同,是否能自动转换,或者使用CRuntimeClass 的字段m_lpszClassName进行匹配(关键是如何得到链表的头部)
答】
1) m_pNextClass 为空,表示你的类可能在链表尾部!
2) 可以实现,部分代码如下:
CObject* GetShapeClass(CString strClassName)
{
CRuntimeClass *pClass;
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
for(pClass = pModuleState->m_classList;pClass!=NULL;
pClass=pClass->m_pNextClass)
{
if(strClassName.Compare(pClass->m_lpszClassName)==0){
return (pClass->CreateObject());
}
}
return null;
}
返回的指针是cobject类型,你可以转换成正确的类型!

问:出现“未解决的外部类型”?

答:文件未包含、编译或该添加的库没有包含。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: