📄 apb.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"><HTML><HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1"><SCRIPT LANGUAGE="JavaScript"><!--function popUp(pPage) { var fullURL = document.location; var textURL = fullURL.toString(); var URLlen = textURL.length; var lenMinusPage = textURL.lastIndexOf("/"); lenMinusPage += 1; var fullPath = textURL.substring(0,lenMinusPage); popUpWin = window.open('','popWin','resizable=yes,scrollbars=no,width=525,height=394'); figDoc= popUpWin.document; zhtm= '<HTML><HEAD><TITLE>' + pPage + '</TITLE>'; zhtm += '</head>'; zhtm += '<BODY bgcolor="#FFFFFF">'; zhtm += '<IMG SRC="' + fullPath + pPage + '">'; zhtm += '<P><B>' + pPage + '</B>'; zhtm += '</BODY></HTML>'; window.popUpWin.document.write(zhtm); window.popUpWin.document.close(); // Johnny Jackson 4/28/98 }//--> </SCRIPT><link rel="stylesheet" href="/includes/stylesheets/ebooks.css"> <META NAME="GENERATOR" Content="Symantec Visual Page Mac 1.1.1"> <TITLE>Teach Yourself Visual C++ 6 in 21 Days -- Appendix B -- Answers</TITLE></HEAD><BODY TEXT="#000000" BGCOLOR="#FFFFFF"><H1 ALIGN="CENTER"><IMG SRC="../button/sams.gif" WIDTH="171" HEIGHT="66" ALIGN="BOTTOM"BORDER="0"><BR>Teach Yourself Visual C++ 6 in 21 Days</H1><CENTER><P><A HREF="../apa/apa.htm"><IMG SRC="../button/previous.gif" WIDTH="128" HEIGHT="28"ALIGN="BOTTOM" ALT="Previous chapter" BORDER="0"></A><A HREF="../apc/apc.htm"><IMGSRC="../button/next.gif" WIDTH="128" HEIGHT="28" ALIGN="BOTTOM" ALT="Next chapter"BORDER="0"></A><A HREF="../index.htm"><IMG SRC="../button/contents.gif" WIDTH="128"HEIGHT="28" ALIGN="BOTTOM" ALT="Contents" BORDER="0"></A> <HR></CENTER><H1 ALIGN="CENTER">- B -<BR>Answers</H1><UL> <LI><A HREF="#Heading1">Day 1</A> <LI><A HREF="#Heading4">Day 2</A> <LI><A HREF="#Heading7">Day 3</A> <LI><A HREF="#Heading10">Day 4</A> <LI><A HREF="#Heading12">Exercise</A> <LI><A HREF="#Heading13">Day 5</A> <LI><A HREF="#Heading16">Day 6</A> <LI><A HREF="#Heading19">Day 7</A> <LI><A HREF="#Heading22">Day 8</A> <LI><A HREF="#Heading25">Day 9</A> <LI><A HREF="#Heading28">Day 10</A> <LI><A HREF="#Heading31">Day 11</A> <LI><A HREF="#Heading34">Day 12</A> <LI><A HREF="#Heading37">Day 13</A> <LI><A HREF="#Heading40">Day 14</A> <LI><A HREF="#Heading43">Day 15</A> <LI><A HREF="#Heading46">Day 16</A> <LI><A HREF="#Heading49">Day 17</A> <LI><A HREF="#Heading52">Day 18</A> <LI><A HREF="#Heading55">Day 19</A> <LI><A HREF="#Heading58">Day 20</A> <LI><A HREF="#Heading61">Day 21</A></UL><P><HR SIZE="4"><BR>This appendix provides the answers to the quiz questions and exercises at the endof each chapter.</P><P><H2><A NAME="Heading1"></A>Day 1</H2><H2>Quiz</H2><DL> <DT></DT> <DD><B>1. </B>How do you change the caption on a button? <P> <DT></DT> <DD>In the window layout editor, select the button to be changed. Right-click the mouse and select Properties from the pop-up menu. Change the value in the Caption field. <P> <DT></DT> <DD><B>2. </B>What can you do with the Visual C++ AppWizard? <P> <DT></DT> <DD>You can use it to build a shell for your application, based on the type of application and the functionality needs of the application. The shell will have support for the desired functionality already built in. <P> <DT></DT> <DD><B>3. </B>How do you attach functionality to the click of a button? <P> <DT></DT> <DD>By using the Class Wizard, you can create a function and attach it to an object for handling a specific Windows message. The Class Wizard creates the function and can take you right to the spot in the function's code where you need to begin adding your own code. <P></DL><H3>Exercise</H3><P>Add a second button to the About window in your application. Have the button displaya different message from the one on the first window.</P><DL> <DT></DT> <DD><B>1. </B>In the workspace pane, select the Resource View tab. <P> <DT></DT> <DD><B>2. </B>Expand the dialog tree branch and double-click the IDD_ABOUTBOX dialog, bringing it into the Developer Studio editor. <P> <DT></DT> <DD><B>3. </B>Click the button control on the toolbar. <P> <DT></DT> <DD><B>4. </B>Click and drag the mouse on the window where you want the button to be placed. <P> <DT></DT> <DD><B>5. </B>Open the properties dialog for the new button, changing the ID and caption to describe the message to be displayed by the button. Close the properties dialog. <P> <DT></DT> <DD><B>6. </B>Open the Class Wizard and add a new function for the clicked message for your new button. <P> <DT></DT> <DD><B>7. </B>Click the Edit Code button in the Class Wizard to take you to the spot in your code where your new function is. <P> <DT></DT> <DD><B>8. </B>Add the MessageBox function to display a message to the user. <P> <DT></DT> <DD><B>9. </B>Compile and run your application to test your new button. <P></DL><H2><A NAME="Heading4"></A>Day 2</H2><H3>Quiz</H3><DL> <DT></DT> <DD><B>1. </B>Why do you need to specify the tab order of the controls on your application windows? <P> <DT></DT> <DD>By specifying the tab order of the controls on your application windows, you can control the order in which the user navigates the application window. If the user is using the keyboard to navigate around the application window, then the two primary means of navigating between controls are the tab key and mnemonics that jump directly to specific controls. The tab order helps provide the user with a consistent and predictable experience when using your application. <P> <DT></DT> <DD><B>2. </B>How can you include a mnemonic in a static text field that will take the user to the edit box or combo box beside the text control? <P> <DT></DT> <DD>If you place a mnemonic in a static text control and then make sure that the static text control is just before the edit control associated with the static text, the user can select the mnemonic in the static text control to jump directly to the edit box control. <P> <DT></DT> <DD><B>3. </B>Why do you need to give unique object IDs to the static text fields in front of the edit box and combo boxes? <P> <DT></DT> <DD>The unique object IDs on the two static text controls were necessary because you need to manipulate those two controls with the check boxes that enable or disable and show or hide sets of controls. <P> <DT></DT> <DD><B>4. </B>Why do you need to call the UpdateData function before checking the value of one of the controls? <P> <DT></DT> <DD>If the user has changed the value of the control on the screen, the UpdateData function must be called, passing it TRUE as the function argument, to copy the values from the controls on the window to the variables that are associated with those controls. If UpdateData is not called, then the values of the variables may not correctly reflect what the user has changed on the screen. <P></DL><H3>Exercises</H3><DL> <DT></DT> <DD><B>1. </B>Add code to the Default Message button to reset the edit box to say Enter a message here. <P> <DT></DT> <DD>Using the Class Wizard, add a function to the Default Message button's clicked event. In this function, add the code in Listing B.1. <P></DL><H4>LISTING B.1. DAY2DLG.CPP--THE CODE TO PLACE A DEFAULT MESSAGE IN THE EDIT BOX.</H4><PRE> 1: void CDay2Dlg::OnDfltmsg() 2: { 3: // TODO: Add your control notification handler code here 4: 5: /////////////////////// 6: // MY CODE STARTS HERE 7: /////////////////////// 8: 9: // Set the message to a default message10: m_strMessage = "Enter a message here";11: 12: // Update the screen13: UpdateData(FALSE);14: 15: ///////////////////////16: // MY CODE ENDS HERE17: ///////////////////////</PRE><PRE>18: }</PRE><DL> <DT></DT> <DD><B>2. </B>Add code to enable or disable and show or hide the controls used to select and run another application. <P> <DT></DT> <DD>Add functions to the Enable and Show Program Action check boxes. In these functions, add the code in Listing B.2. <P></DL><H4>LISTING B.2. DAY2DLG.CPP--THE CODE TO ENABLE OR DISABLE AND SHOW OR HIDE THERUN PROGRAM CONTROLS.</H4><PRE> 1: void CDay2Dlg::OnCkenblpgm() 2: { 3: // TODO: Add your control notification handler code here 4: 5: /////////////////////// 6: // MY CODE STARTS HERE 7: /////////////////////// 8: 9: // Get the current values from the screen10: UpdateData(TRUE);11: 12: // Is the Enable Program Action check box checked?13: if (m_bEnablePgm == TRUE)14: {15: // Yes, so enable all controls that have anything16: // to do with running a program17: GetDlgItem(IDC_PROGTORUN)->EnableWindow(TRUE);18: GetDlgItem(IDC_RUNPGM)->EnableWindow(TRUE);19: GetDlgItem(IDC_STATICPGM)->EnableWindow(TRUE);20: }21: else22: {23: // No, so disable all controls that have anything24: // to do with running a program25: GetDlgItem(IDC_PROGTORUN)->EnableWindow(FALSE);26: GetDlgItem(IDC_RUNPGM)->EnableWindow(FALSE);27: GetDlgItem(IDC_STATICPGM)->EnableWindow(FALSE);28: }29: 30: ///////////////////////31: // MY CODE ENDS HERE32: ///////////////////////33: }34: 35: void CDay2Dlg::OnCkshwpgm()36: {37: // TODO: Add your control notification handler code here38: 39: ///////////////////////40: // MY CODE STARTS HERE41: ///////////////////////42: 43: // Get the current values from the screen44: UpdateData(TRUE);45: 46: // Is the Show Program Action check box checked?47: if (m_bShowPgm == TRUE)48: {49: // Yes, so show all controls that have anything50: // to do with running a program51: GetDlgItem(IDC_PROGTORUN)->ShowWindow(TRUE);52: GetDlgItem(IDC_RUNPGM)->ShowWindow(TRUE);53: GetDlgItem(IDC_STATICPGM)->ShowWindow(TRUE);54: }55: else56: {57: // No, so hide all controls that have anything58: // to do with running a program59: GetDlgItem(IDC_PROGTORUN)->ShowWindow(FALSE);60: GetDlgItem(IDC_RUNPGM)->ShowWindow(FALSE);61: GetDlgItem(IDC_STATICPGM)->ShowWindow(FALSE);62: }63: 64: ///////////////////////65: // MY CODE ENDS HERE66: ///////////////////////</PRE><PRE>67: }</PRE><DL> <DT></DT> <DD><B>3. </B>Extend the code in the OnRunpgm function to allow the user to enter his own program name to be run. <P> <DT></DT> <DD>Modify the OnRunpgm function as in Listing B.3. <P></DL><H4>LISTING B.3. DAY2DLG.CPP--THE CODE TO RUN ANY PROGRAM NAME TYPED INTO THE RUNPROGRAM COMBO BOX.</H4><PRE> 1: void CDay2Dlg::OnRunpgm() 2: { 3: // TODO: Add your control notification handler code here 4: 5: /////////////////////// 6: // MY CODE STARTS HERE 7: /////////////////////// 8: 9: // Get the current values from the screen10: UpdateData(TRUE);11: 12: // Declare a local variable for holding the program name13: CString strPgmName;14: 15: // Copy the program name to the local variable16: strPgmName = m_strProgToRun;17: 18: // Make the program name all uppercase19: strPgmName.MakeUpper();20: 21: // Did the user select to run the Paint program?22: if (strPgmName == "PAINT")23: // Yes, run the Paint program24: WinExec("pbrush.exe", SW_SHOW);25: 26: // Did the user select to run the Notepad program?27: if (strPgmName == "NOTEPAD")28: // Yes, run the Notepad program29: WinExec("notepad.exe", SW_SHOW);30: 31: // Did the user select to run the Solitaire program?32: if (strPgmName == "SOLITAIRE")33: // Yes, run the Solitaire program34: WinExec("sol.exe", SW_SHOW);35: 36: // Run any other program name typed into the combo box37: if ((strPgmName != "PAINT") && (strPgmName != "NOTEPAD") &&38: (strPgmName != "SOLITAIRE"))39: // Yes, run the program typed into the combo box40: WinExec(strPgmName, SW_SHOW);41: 42: ///////////////////////43: // MY CODE ENDS HERE44: ///////////////////////</PRE><P>45: }</P><P><H2><A NAME="Heading7"></A>Day 3</H2><H3>Quiz</H3><DL> <DT></DT> <DD><B>1. </B>What are the possible mouse messages that you can add functions for? <P> <DT></DT> <DD>WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN, WM _RBUTTONUP, WM_RBUTTONDBLCLK, WM_MOUSEMOVE, and WM_MOUSEWHEEL. <P> <DT></DT> <DD><B>2. </B>How can you tell if the left mouse button is down on the WM_MOUSEMOVE event message? <P> <DT></DT> <DD>You can mask the flags passed to the OnMouseMove function with the MK_LBUTTON flag, as follows: <P></DL><PRE>((nFlags & MK_LBUTTON) == MK_LBUTTON)</PRE><DL> <DT></DT> <DD><B>3. </B>How can you prevent the cursor from changing back to the default cursor after you set it to a different one? <P> <DT></DT> <DD>Return TRUE in the OnSetCursor event function, preventing the ancestor OnSetCursor function from being called. <P></DL><H3>Exercises</H3><DL> <DT></DT> <DD><B>1. </B>Modify your drawing program so that the left mouse button can draw in red and the right mouse button can draw in blue. <P> <DT></DT> <DD>Add a function for the WM_RBUTTONDOWN event message and write the code for it as in Listing B.4. <P></DL><H4>LISTING B.4. MOUSEDLG.CPP--THE OnRButtonDown FUNCTION.</H4><PRE> 1: void CMouseDlg::OnRButtonDown(UINT nFlags, CPoint point) 2: { 3: // TODO: Add your message handler code here and/or call default 4: 5: /////////////////////// 6: // MY CODE STARTS HERE 7: /////////////////////// 8: 9: // Set the current point as the starting point10: m_iPrevX = point.x;11: m_iPrevY = point.y;12:13: ///////////////////////14: // MY CODE ENDS HERE15: ///////////////////////16:17: CDialog::OnRButtonDown(nFlags, point);</PRE><PRE>18: }</PRE><DL> <DT></DT> <DD>Extend the OnMouseMove function as in Listing B.5. <P></DL><H4>LISTING B.5. MOUSEDLG.CPP--THE MODIFIED OnMouseMove FUNCTION.</H4>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -