孙鑫老师VC笔记

void CMainFrame::OnHello() {

MessageBox(\}

8.动态增加电话号码本步骤

a.处理WM_Char消息。如果回车,则清空字符串,窗口重绘invalidate,将人名加入到菜单中,将字符串保存集合类CStringArray中,用的是成员函数Add方法。 b.取出动态创建的菜单的数据的方法。

1)创建一个弹出菜单,弹出菜单下面有4个子菜单。将子菜单的ID号连续。 2)在resource.h中添加#define IDM_PHONE1 123.... 3)添加其消息响应函数。注意注释中的文字 BEGIN_MESSAGE_MAP(CMenu2View, CView) //{{AFX_MSG_MAP(CMenu2View) ON_WM_CHAR()

ON_COMMAND(ID_EDIT_COPY, OnEditCopy)//下面的4句代码原来在此处。 //}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(IDM_PHONE1, OnPhone1)//一定要这4句代码移到此处。 ON_COMMAND(IDM_PHONE2, OnPhone2) ON_COMMAND(IDM_PHONE3, OnPhone3) ON_COMMAND(IDM_PHONE4, OnPhone4)

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() 4)填写代码

9.如何在MainFrame中拦截OnCommand消息?答,在它增加OnCommand的消息处理函数即可。

10.错误调试方法:Missing \before \

CMenu2Doc* GetDocument();//因为CMenu2Doc是个不认识的变量,将其头文件包含进即可。 第7课

1.如果在SDI中要调用对话框 a.先插入一个对话框资源;

b.然后在ClassWizards中为其创建一个类。其目的是比较方便为添加按纽和消息响应函数。 c.然后实例化它。在实例化时,必须将其头文件包含进去。

2.创建非模态对话框,注意它不能是局部变量。当 点击非模态对话框的OnOK按纽时,它并没有关闭,而是隐藏了。需要调用destroyWindow().

3.一个对象只能一个按纽。为什么?因为在Wincore.cpp的628行有代码 ASSERT(pWnd->m_hWnd == NULL); // only do once而创建后它的m_hWnd就不为0了。此处ASSERT的用法是如果括号里面不为真,则程序崩溃。

4.如何为静态文本框增加消息响应?首先将IDC_STATIC改名。同时还需要将Notify特性复选中。

5.完成加法功能。 a.GetDlgItem(); b.GetDlgItemText(); c.GetDlgItemInt();

d.将IDC_EDIT1关联CEDIT类型变量

e.将IDC_EDIT1关联int型变量。注意调用 UpdateData();

f. //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1); m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);

g. SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1); SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2); 6.点击按纽改变窗口尺寸

if(GetDlgItemText(IDC_BUTTON2,str),str==\收缩<<\{

SetDlgItemText(IDC_BUTTON2,\扩展>>\static CRect rectLarge; static CRect rectSmall; if(rectLarge.IsRectNull()) {

CRect rectSeparator; GetWindowRect(&rectLarge);

GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator); rectSmall.left=rectLarge.left; rectSmall.top=rectLarge.top; rectSmall.right=rectLarge.right;

rectSmall.bottom=rectSeparator.bottom; }

if(str==\收缩<<\{

SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDER); }

else {

SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER); }

7.回车时将输入焦点移动到下一个控件 SetWindowLong()改变窗口的属性。 方法1:

改变控件的回调函数,注意IDC_EDIT1的MultiLine要复选上。 WNDPROC prevProc;

LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier

WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) {

if(uMsg==WM_CHAR && wParam==0x0d) {

//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT)); //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT)); CString str;

str.Format(\

AfxMessageBox(str);//, UINT nType = MB_OK, UINT nIDHelp = 0 ); // AfxGetApp()->

SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE)); return 1; } else {

return prevProc(hwnd,uMsg,wParam,lParam); } }

BOOL CTestDlg::OnInitDialog() {

CDialog::OnInitDialog();

// TOD Add extra initialization here

prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPR

OC,

(LONG)WinSunProc);//设置回调函数

return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 方法2:

在OnOK响应函数中加入代码

//GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus(); //GetFocus()->GetNextWindow()->SetFocus();

//GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus(); GetNextDlgTabItem(GetFocus())->SetFocus();

第8课 对话框

1.如何改变按纽的字体?在对话框的属性中改变字体的属性即可 2.逃跑按纽的实现

1.从CButton派生一个类,CWeixinBtn

2.将IDC_EDIT1关联成员变量m_btn1,类型为CWeixinBtn,注意要包含头文件。 3.在CWeixinBtn中加一个指针成员变量CWeixinBtn *pWeixinBtn,然后将其地址初始化。 4.在新类中增加鼠标移动的消息处理。 3.属性表单

1.插入属性页资源。Insert->new Resource->Dialog

2.当选择Classwizard菜单时,系统提示是否为创建新的类,我们将其从CPropertyPage派生!这样可以为

方便为其增加消息响应函数。

3.插入新的从CPropertySheet派生的类,在类中增加3个CPropertyPage的实例。

4.在view中增加菜单项,当点击时显示属性表单,出现中文乱码,修改CPropertyPage属性为中文,另外将 其字体设为宋体。

5.在CPropertyPage中设置SetWizardButtons可将其属性改为上一步、完成!

6.为IDC_RADIO1关联成员变量,需要先设置Group属性才行。另外别忘记调用UpdateData(). 7.为CPropertyPage增加虚函数,OnWizardNext,如果用户点击下一步时,不想让他进入下一步,刚返回-1!

8.将用户的选择输出到屏幕上,此时可以在View中增加几个成员变量,用来接收用户选择的数据。

4.memset()的用法! memset(m_bLike,0,sizeof(m_bLike)); 第9课

1.修改外观和图标可以在MainFrm中进行,而修改背景和光标只能在View中进行。为什么?因为view的显示挡

在了MainFrame的前面。 a.在MainFrame中

PreCreateWindow()中,在窗口创建之前,用重新注册窗口类的方法,比较麻烦。在PreCreateWindow ()中修改

也可以用简单的方法,用全局函数

//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0, // LoadIcon(NULL,IDI_WARNING)); 在窗口创建之后,在OnCreate()中修改

//SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);

//SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);

// SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR)); b.在View中

PreCreateWindow()中

//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,

// LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),NULL); cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW); OnCreate()中

SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP)); 2.创建一个不断变化的图标。用定时器和SetClassLong完成

a.准备三个图标文件,放在RES文件夹,Insert->Resource-三个图标, b.在CMainFrame中增加图标句柄数组,m_hIcons[3]

m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE

(IDI_ICON1));//MAKEINTRESOURCE是一个宏,它将整数转化为Win32的资源类型,简单的说它是一个类型转换

#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))

m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));//此处需要用到

theAPP对象,故要在文件中声明extern CStyleApp theApp;

m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); 然后将其初始化 c.然后在定时器中实现 3.工具栏的编程

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4