VC常见问题解答

  • 格式:docx
  • 大小:40.94 KB
  • 文档页数:31

VC常见问题解答

VC常见问题解答

1. 如何获取应用程序的实例句柄? (3)

2. 如何通过代码获得应用程序主窗口的指针? (3)

3. 如何在程序中获得其他程序的图标? (3)

4. 如何编程结束应用程序?如何编程控制windows的重新引导? (3)

5.怎样加载其他的应用程序? (4)

6. 如何自定义消息 (4)

7. 如何改变窗口的图标? (4)

8. 如何改变窗口的缺省风格? (4)

11. 如何将窗口居中显示? (5)

12. 如何让窗口和MDI窗口一启动就最大化和最小化? (5)

13. 常用的视图类 (5)

14. 如何获取有关窗口正在处理的当前消息的信息 (5)

15. 如何创建一个不规则形状的窗口 (5)

16. 如何在代码中获取工具条和状态条的指针 (7)

17. 如何使能和禁止工具条的工具提示 (7)

18. 如何设置工具条标题 (7)

19. 如何创建和使用无模式对话框 (7)

20. 如何在对话框中显示一个位图 (8)

21. 如何改变对话或窗体视窗的背景颜色 (8)

22. 如何获取一个控件的指针 (9)

23. 如何禁止和使能控件 (9)

24. 如何改变控件的字体 (9)

25. 如何用位图显示按钮 (10)

26. 计算器按下ESC键消失问题的解决 (10)

27. 鼠标拖动窗口任意位置移动窗口 (11)

28.如何解决同学们做的记事本屏幕闪烁问题? (11)

29. 如何解决将工程目录拷贝后发现Tipdlg.h找不到的错误? (11) 30.为什么我们自己的应用程序程序只能打开自己保存的文件,别的程序(如Windows的记事本)不能打开我们的程序生成的文件?

(11)

31. 如何解决插入符位置不正确(每添加一个字符,插入符位置不正确)? (12)

32. 如何响应回车等虚键? (12)

33. 改变应用程序(视图类基于CEditView)的背景颜色 (13)

34. 改变应用程序(视图类基于CEditView)的文本颜色。 (14)

35. 改变应用程序(视图类基于CEditView)的字体。 (15)

36.如何保存前面设置的字体颜色、背景颜色和字体? (16)

37. CFindReplaceDialog类的用法 (18)

38. 如何理解windows的句柄? (19)

39. 常见的Afx全局函数 (20)

40. CString 与char []之间的转换 (20)

41. 关闭程序 (20)

42. 如何修改窗体的标题 (20)

43. 得到窗体的标题 (20)

44. 在多文档/视图中如何使子窗口最大化 (20)

45. 在多文档/视图中如何屏蔽子对话框:在APP类里把这两句话屏蔽掉 (20)

46. 在多文档/视图中如何关闭子窗口 (21)

47. 怎样禁止改变窗口的大小和不能移动的窗口: (21)

48.使窗口始终在最前方 (21)

49. 链表程序有问题 (21)

50. 常见变量类型转换 (23)

51. error C2065错误提示解析。 (24)

52. 删除添加的消息响应函数 (25)

53. 使窗口的关闭按钮无效 (25)

54. 状态栏显示不下要显示的文字 (25)

55. 采用了滚动视图,在画图时鼠标在窗口外不绘制图形 (25) 56. 怎么样更改画图时鼠标的形状? (26)

57. 绘图中橡皮的擦除效果该如何实现? (26)

58.怎么样使右键弹出菜单(popup menu)中的“减少硬币”也能象菜单中的“减少硬币”一样具有禁用效果,或说是变灰色的效果。

(27)

59. 如何去掉静态文本控件的灰色背景 (28)

60. 用C++编一个将二进制纯小数转化为十进制的程序中的问题

(28)

61. 如何为对话框加一个菜单? (29)

62. 如何使对话框的图标动起来? (29)

63. 关于二进制,十进制,十六进制之间的转换问题 (30)

64. 从输入框中输入数据,想把数据从CString类型转换成double类型 (30)

65. 如何改变计算器中部分按钮的字体 (30)

1. 如何获取应用程序的实例句柄?

应用程序的实例句柄保存在CWinAppIm_hInstance 中,可以调用AfxGetInstancdHandle获得句柄。

例如:HANDLE hInstance=AfxGetInstanceHandle();

2. 如何通过代码获得应用程序主窗口的指针?

主窗口的指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。

AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED);

//使程序最大化.

3. 如何在程序中获得其他程序的图标?

有两种方法:

(1) SDK函数SHGetFileInfo 或使用ExtractIcon获得图标资源的handle

(2) SDK函数SHGetFileInfo获得有关文件的很多信息,如大小图标,属性, 类型等.

例如(1): 在程序窗口左上角显示NotePad图标. void CSampleView: OnDraw(CDC * pDC)

{

if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,

&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))

{

pDC ->DrawIcon(10,10,stFileInfo.hIcon);

}

}

例如(2):同样功能,使用ExtractIcon Function函数

void CSampleView:: OnDraw(CDC *pDC)

{

HICON hIcon=::

ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);

if (hIcon &&hIcon!=(HICON)-1)

pDC->DrawIcon(10,10,hIcon);

}

说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到,如果是调用win95下的画笔,应该用访问注册表的方法获得其路径。

4. 如何编程结束应用程序?如何编程控制windows的重新引导?

这是编程中经常要遇到的问题。

第一问,向窗口发送WM_CLOSE消息,调用CWnd::OnClose成员函数。允许对用户提示是否保存修改过的数据.

例如: AfxGetMainWindow()->SendMessage(WM_CLOSE);

还可以创建一个自定义的函数结束Window

void Terminate Window(LPCSTR pCaption)

{

CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);

if (pWnd)

pWnd ->SendMessage(WM_CLOSE); }

说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测Notepad是不

是已运行,而事先不知道Notepad的标题栏,这时FindWindow就无能为力了,可以通过枚举windows任务列表的办法来实现。

第二问,使用ExitWindowsEx函数控制系统是重新引导,还是重启windows。

5.怎样加载其他的应用程序?

三个SDK函数winexec,shellexecute,createprocess可以使用。

WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式。后一个参数值得说一下,比如用SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序,就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。

ShellExecute较WinExex灵活一点,可以指定工作目录,下面的例子就是直接打开c:\temp\1.txt,而不用加载与txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口,来显示Readme 等文件,就是采用的这种方式。

ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);

CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。例如:

STARTUPINFO stinfo; //启动窗口的信息

PROCESSINFO procinfo; //进程的信息

CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,

NORMAL_PRIORITY_

CLASS,NULL,NULL, &stinfo,&procinfo);

6. 如何自定义消息

(1) 手工定义消息,可以这么写#define WM_MY_MESSAGE(WM_USER+100),MS推荐的至少是WM_USER+100;

(2)写消息处理函数,用WPARAM,LPARAM返回LRESULT.

LRESULT CMainFrame::OnMyMessage(WPARAM

wparam,LPARAM lParam)

{

//加入你的处理函数

}

(3) 在类的AFX_MSG处进行声明

7. 如何改变窗口的图标?

向窗口发送WM_SECTION消息。

例如:

HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON);

ASSERT(hIcon);

AfxGetMainWnd()

->SendMessage(WM_SETICON,TRUE,(LPARAM) hIcon);

8. 如何改变窗口的缺省风格?

重载CWnd:: PreCreateWindow 并修改CREATESTRUCT结构来指定窗口风格和其他创建信息。

例如:去掉窗口的最大化按钮和还原按钮,并设置窗口的大小

BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs)

{

cs.style &=~WS_MAXINIZEMOX;

cs.x=cs.y=0;

cs.cx=GetSystemMetrics(SM_CXSCREEN/2);

cs.cy=GetSystemMetrics(SM_CYSCREEN/2);

return CMDIFramewnd ::PreCreateWindow(cs);

}

11. 如何将窗口居中显示?

调用函数CWnd:: CenterWindows