<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_ganmk</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/29548/rss</id><updated>2011-10-27T09:19:18Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/29548/rss"/><entry><id>http://www.cnblogs.com/ganmk/archive/2011/10/27/2226847.html</id><title type="text">C#中使用 SendMessage 向非顶端窗体发送组合键</title><summary type="text">比如发送ALT + F以下是 用spy++截取的消息内容&lt;00001&gt; 000310DC P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0&lt;00002&gt; 000310DC P WM_SYSKEYDOWN nVirtKey:'F' cRepeat:1 ScanCode:21 fExtended:0 fAltDown:1 fRepeat:0 fUp:0&lt;00003&gt; 000310DC P WM_SYSCHAR </summary><published>2011-10-27T09:19:00Z</published><updated>2011-10-27T09:19:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2011/10/27/2226847.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2011/10/27/2226847.html"/><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "&gt;&lt;p&gt;比如发送ALT + F&lt;/p&gt;&lt;p&gt;以下是 用spy++截取的消息内容&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;lt;00001&amp;gt; 000310DC P WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0&lt;br /&gt;&amp;lt;00002&amp;gt; 000310DC P WM_SYSKEYDOWN nVirtKey:'F' cRepeat:1 ScanCode:21 fExtended:0 fAltDown:1 fRepeat:0 fUp:0&lt;br /&gt;&amp;lt;00003&amp;gt; 000310DC P WM_SYSCHAR chCharCode:'102' (102) cRepeat:1 ScanCode:21 fExtended:0 fAltDown:1 fRepeat:0 fUp:0&lt;br /&gt;&amp;lt;00004&amp;gt; 000310DC P WM_SYSKEYUP nVirtKey:'F' cRepeat:1 ScanCode:21 fExtended:0 fAltDown:1 fRepeat:1 fUp:1&lt;br /&gt;&amp;lt;00005&amp;gt; 000310DC P WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:0 fRepeat:1 fUp:1&lt;/p&gt;&lt;p&gt;转换为 SendMessage&lt;/p&gt;&lt;p&gt;[DllImport("user32.dll", EntryPoint = "SendMessage")]&lt;br /&gt;public static extern int SendMessage(IntPtr hwnd, int wMsg, uint wParam, uint lParam);&lt;/p&gt;&lt;p&gt;SendMessage(hwnd, 0x0104, 0x00000012, 0x20380001);//(0x00000012 == VK_MENU(ALT键))&lt;br /&gt;SendMessage(hwnd, 0x0104, 0x00000046, 0x20210001);//这一行可以省略(0x00000046 == 'F')&lt;/p&gt;&lt;p&gt;SendMessage(hwnd, 0x0106, 0x00000066, 0x20210001);//发送一个char 'f'&lt;br /&gt;SendMessage(hwnd, 0x0105, 0x00000046, 0xE0210001);//这一行可以省略(0x00000046 == 'F')&lt;br /&gt;SendMessage(hwnd, 0x0105, 0x00000012, 0xC0380001);//(0x00000012 == VK_MENU(ALT键))&lt;/p&gt;&lt;p&gt;过程是这样的:&lt;/p&gt;&lt;p&gt;首先 发送了一个 ALT按下 //(WM_SYSKEYDOWN == 0x0104)&lt;/p&gt;&lt;p&gt;然后 发送了一个 'F'键&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //这里省略可以实现同样功能 系统兼容性问题 建议发送这个键&lt;/p&gt;&lt;p&gt;然后 发送了一个 字符'f'&amp;nbsp;&amp;nbsp;&amp;nbsp; //(WM_SYSCHAR == 0x0106)&lt;/p&gt;&lt;p&gt;然后 抬起按键&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'F'键&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //这里省略可以实现同样功能 系统兼容性问题 建议发送这个键&lt;/p&gt;&lt;p&gt;最后 抬起按键&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALT键&amp;nbsp;&amp;nbsp;&amp;nbsp; //(WM_SYSKEYUP == 0x0105)&lt;/p&gt;&lt;p&gt;要实现类似功能 比如 ALT +&amp;nbsp;a 可以这么写&lt;/p&gt;&lt;p&gt;SendMessage(hwnd, 0x0104, 0x00000012, 0x20380001);//0x00000012可以写成0x12&lt;br /&gt;SendMessage(hwnd, 0x0104, 0x00000041, 0x201E0001);//0x00000041可以写成0x41&lt;/p&gt;&lt;p&gt;SendMessage(hwnd, 0x0106, (int)'a', 0x20210001);// (把char转换为 int 或者API声明时传递参数wParam为char)&amp;nbsp;&lt;br /&gt;SendMessage(hwnd, 0x0105, 0x00000041, 0xE01E0001);//0x00000041 == 'A'&lt;br /&gt;SendMessage(hwnd, 0x0105, 0x00000012, 0xC0380001);//&lt;/p&gt;&lt;p&gt;下面列举一下键盘按键对应值:&lt;/p&gt;&lt;p&gt;//Windows 使用的256个虚拟键码&lt;br /&gt;public const int VK_LBUTTON = 0x1&lt;br /&gt;public const int VK_RBUTTON = 0x2&lt;br /&gt;public const int VK_CANCEL = 0x3&lt;br /&gt;public const int VK_MBUTTON = 0x4&lt;br /&gt;public const int VK_BACK = 0x8&lt;br /&gt;public const int VK_TAB = 0x9&lt;br /&gt;public const int VK_CLEAR = 0xC&lt;br /&gt;public const int VK_RETURN = 0xD&lt;br /&gt;public const int VK_SHIFT = 0x10&lt;br /&gt;public const int VK_CONTROL = 0x11&lt;br /&gt;public const int VK_MENU = 0x12&lt;br /&gt;public const int VK_PAUSE = 0x13&lt;br /&gt;public const int VK_CAPITAL = 0x14&lt;br /&gt;public const int VK_ESCAPE = 0x1B&lt;br /&gt;public const int VK_SPACE = 0x20&lt;br /&gt;public const int VK_PRIOR = 0x21&lt;br /&gt;public const int VK_NEXT = 0x22&lt;br /&gt;public const int VK_END = 0x23&lt;br /&gt;public const int VK_HOME = 0x24&lt;br /&gt;public const int VK_LEFT = 0x25&lt;br /&gt;public const int VK_UP = 0x26&lt;br /&gt;public const int VK_RIGHT = 0x27&lt;br /&gt;public const int VK_DOWN = 0x28&lt;br /&gt;public const int VK_Select = 0x29&lt;br /&gt;public const int VK_PRINT = 0x2A&lt;br /&gt;public const int VK_EXECUTE = 0x2B&lt;br /&gt;public const int VK_SNAPSHOT = 0x2C&lt;br /&gt;public const int VK_Insert = 0x2D&lt;br /&gt;public const int VK_Delete = 0x2E&lt;br /&gt;public const int VK_HELP = 0x2F&lt;br /&gt;public const int VK_0 = 0x30&lt;br /&gt;public const int VK_1 = 0x31&lt;br /&gt;public const int VK_2 = 0x32&lt;br /&gt;public const int VK_3 = 0x33&lt;br /&gt;public const int VK_4 = 0x34&lt;br /&gt;public const int VK_5 = 0x35&lt;br /&gt;public const int VK_6 = 0x36&lt;br /&gt;public const int VK_7 = 0x37&lt;br /&gt;public const int VK_8 = 0x38&lt;br /&gt;public const int VK_9 = 0x39&lt;br /&gt;public const int VK_A = 0x41&lt;br /&gt;public const int VK_B = 0x42&lt;br /&gt;public const int VK_C = 0x43&lt;br /&gt;public const int VK_D = 0x44&lt;br /&gt;public const int VK_E = 0x45&lt;br /&gt;public const int VK_F = 0x46&lt;br /&gt;public const int VK_G = 0x47&lt;br /&gt;public const int VK_H = 0x48&lt;br /&gt;public const int VK_I = 0x49&lt;br /&gt;public const int VK_J = 0x4A&lt;br /&gt;public const int VK_K = 0x4B&lt;br /&gt;public const int VK_L = 0x4C&lt;br /&gt;public const int VK_M = 0x4D&lt;br /&gt;public const int VK_N = 0x4E&lt;br /&gt;public const int VK_O = 0x4F&lt;br /&gt;public const int VK_P = 0x50&lt;br /&gt;public const int VK_Q = 0x51&lt;br /&gt;public const int VK_R = 0x52&lt;br /&gt;public const int VK_S = 0x53&lt;br /&gt;public const int VK_T = 0x54&lt;br /&gt;public const int VK_U = 0x55&lt;br /&gt;public const int VK_V = 0x56&lt;br /&gt;public const int VK_W = 0x57&lt;br /&gt;public const int VK_X = 0x58&lt;br /&gt;public const int VK_Y = 0x59&lt;br /&gt;public const int VK_Z = 0x5A&lt;br /&gt;public const int VK_STARTKEY = 0x5B&lt;br /&gt;public const int VK_CONTEXTKEY = 0x5D&lt;br /&gt;public const int VK_NUMPAD0 = 0x60&lt;br /&gt;public const int VK_NUMPAD1 = 0x61&lt;br /&gt;public const int VK_NUMPAD2 = 0x62&lt;br /&gt;public const int VK_NUMPAD3 = 0x63&lt;br /&gt;public const int VK_NUMPAD4 = 0x64&lt;br /&gt;public const int VK_NUMPAD5 = 0x65&lt;br /&gt;public const int VK_NUMPAD6 = 0x66&lt;br /&gt;public const int VK_NUMPAD7 = 0x67&lt;br /&gt;public const int VK_NUMPAD8 = 0x68&lt;br /&gt;public const int VK_NUMPAD9 = 0x69&lt;br /&gt;public const int VK_MULTIPLY = 0x6A&lt;br /&gt;public const int VK_ADD = 0x6B&lt;br /&gt;public const int VK_SEPARATOR = 0x6C&lt;br /&gt;public const int VK_SUBTRACT = 0x6D&lt;br /&gt;public const int VK_DECIMAL = 0x6E&lt;br /&gt;public const int VK_DIVIDE = 0x6F&lt;br /&gt;public const int VK_F1 = 0x70&lt;br /&gt;public const int VK_F2 = 0x71&lt;br /&gt;public const int VK_F3 = 0x72&lt;br /&gt;public const int VK_F4 = 0x73&lt;br /&gt;public const int VK_F5 = 0x74&lt;br /&gt;public const int VK_F6 = 0x75&lt;br /&gt;public const int VK_F7 = 0x76&lt;br /&gt;public const int VK_F8 = 0x77&lt;br /&gt;public const int VK_F9 = 0x78&lt;br /&gt;public const int VK_F10 = 0x79&lt;br /&gt;public const int VK_F11 = 0x7A&lt;br /&gt;public const int VK_F12 = 0x7B&lt;br /&gt;public const int VK_F13 = 0x7C&lt;br /&gt;public const int VK_F14 = 0x7D&lt;br /&gt;public const int VK_F15 = 0x7E&lt;br /&gt;public const int VK_F16 = 0x7F&lt;br /&gt;public const int VK_F17 = 0x80&lt;br /&gt;public const int VK_F18 = 0x81&lt;br /&gt;public const int VK_F19 = 0x82&lt;br /&gt;public const int VK_F20 = 0x83&lt;br /&gt;public const int VK_F21 = 0x84&lt;br /&gt;public const int VK_F22 = 0x85&lt;br /&gt;public const int VK_F23 = 0x86&lt;br /&gt;public const int VK_F24 = 0x87&lt;br /&gt;public const int VK_NUMLOCK = 0x90&lt;br /&gt;public const int VK_OEM_SCROLL = 0x91&lt;br /&gt;public const int VK_OEM_1 = 0xBA&lt;br /&gt;public const int VK_OEM_PLUS = 0xBB&lt;br /&gt;public const int VK_OEM_COMMA = 0xBC&lt;br /&gt;public const int VK_OEM_MINUS = 0xBD&lt;br /&gt;public const int VK_OEM_PERIOD = 0xBE&lt;br /&gt;public const int VK_OEM_2 = 0xBF&lt;br /&gt;public const int VK_OEM_3 = 0xC0&lt;br /&gt;public const int VK_OEM_4 = 0xDB&lt;br /&gt;public const int VK_OEM_5 = 0xDC&lt;br /&gt;public const int VK_OEM_6 = 0xDD&lt;br /&gt;public const int VK_OEM_7 = 0xDE&lt;br /&gt;public const int VK_OEM_8 = 0xDF&lt;br /&gt;public const int VK_ICO_F17 = 0xE0&lt;br /&gt;public const int VK_ICO_F18 = 0xE1&lt;br /&gt;public const int VK_OEM102 = 0xE2&lt;br /&gt;public const int VK_ICO_HELP = 0xE3&lt;br /&gt;public const int VK_ICO_00 = 0xE4&lt;br /&gt;public const int VK_ICO_CLEAR = 0xE6&lt;br /&gt;public const int VK_OEM_RESET = 0xE9&lt;br /&gt;public const int VK_OEM_JUMP = 0xEA&lt;br /&gt;public const int VK_OEM_PA1 = 0xEB&lt;br /&gt;public const int VK_OEM_PA2 = 0xEC&lt;br /&gt;public const int VK_OEM_PA3 = 0xED&lt;br /&gt;public const int VK_OEM_WSCTRL = 0xEE&lt;br /&gt;public const int VK_OEM_CUSEL = 0xEF&lt;br /&gt;public const int VK_OEM_ATTN = 0xF0&lt;br /&gt;public const int VK_OEM_FINNISH = 0xF1&lt;br /&gt;public const int VK_OEM_COPY = 0xF2&lt;br /&gt;public const int VK_OEM_AUTO = 0xF3&lt;br /&gt;public const int VK_OEM_ENLW = 0xF4&lt;br /&gt;public const int VK_OEM_BACKTAB = 0xF5&lt;br /&gt;public const int VK_ATTN = 0xF6&lt;br /&gt;public const int VK_CRSEL = 0xF7&lt;br /&gt;public const int VK_EXSEL = 0xF8&lt;br /&gt;public const int VK_EREOF = 0xF9&lt;br /&gt;public const int VK_PLAY = 0xFA&lt;br /&gt;public const int VK_ZOOM = 0xFB&lt;br /&gt;public const int VK_NONAME = 0xFC&lt;br /&gt;public const int VK_PA1 = 0xFD&lt;br /&gt;public const int VK_OEM_CLEAR = 0xFE&lt;/p&gt;&lt;p&gt;按照以上对照表 写快捷键 CTRL + F :&lt;/p&gt;&lt;p&gt;SendMessage(hwnd, 0x0104, 0x11, 0x20380001);//0x11 == VK_CONTROL&amp;nbsp;== ALT键&lt;/p&gt;&lt;p&gt;SendMessage(hwnd, 0x0104, (int)'F', 0x20210001);//&lt;/p&gt;&lt;p&gt;SendMessage(hwnd, 0x0106, (int)'f', 0x20210001);//&amp;nbsp;&lt;br /&gt;SendMessage(hwnd, 0x0105, (int)'F', 0xE0210001);//&lt;br /&gt;SendMessage(hwnd, 0x0105, 0x11, 0xC0380001);//&lt;/p&gt;&lt;p&gt;忘记说了 关于参数 lParam 是这么说的:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;&lt;/p&gt;&lt;dl sizset="13" sizcache="1"&gt;&lt;dt&gt;&lt;em&gt;nVirtKey&lt;/em&gt;&amp;nbsp;&lt;/dt&gt;&lt;dd&gt;Value&amp;nbsp;of&amp;nbsp;&lt;em&gt;wParam&lt;/em&gt;.&amp;nbsp;Specifies&amp;nbsp;the&amp;nbsp;virtual-key&amp;nbsp;code&amp;nbsp;of&amp;nbsp;the&amp;nbsp;key&amp;nbsp;being&amp;nbsp;pressed.&amp;nbsp;&lt;/dd&gt;&lt;dt&gt;&lt;em&gt;lKeyData&lt;/em&gt;&amp;nbsp;&lt;/dt&gt;&lt;dd&gt;Value&amp;nbsp;of&amp;nbsp;&lt;em&gt;lParam&lt;/em&gt;.&amp;nbsp;Specifies&amp;nbsp;the&amp;nbsp;repeat&amp;nbsp;count,&amp;nbsp;scan&amp;nbsp;code,&amp;nbsp;extended-key&amp;nbsp;flag,&amp;nbsp;context&amp;nbsp;code,&amp;nbsp;previous&amp;nbsp;key-state&amp;nbsp;flag,&amp;nbsp;and&amp;nbsp;transition-state&amp;nbsp;flag,&amp;nbsp;as&amp;nbsp;shown&amp;nbsp;in&amp;nbsp;the&amp;nbsp;following&amp;nbsp;table.&amp;nbsp;&lt;table border="0" cellspacing="4"&gt;&lt;tbody&gt;&lt;tr valign="top"&gt;&lt;th width="16%" align="left"&gt;Value&lt;/th&gt;&lt;th width="84%" align="left"&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td width="16%" style="font-size: 12px; "&gt;0&amp;#8211;15&lt;/td&gt;&lt;td width="84%" style="font-size: 12px; "&gt;Specifies&amp;nbsp;the&amp;nbsp;repeat&amp;nbsp;count&amp;nbsp;for&amp;nbsp;the&amp;nbsp;current&amp;nbsp;message.&amp;nbsp;The&amp;nbsp;value&amp;nbsp;is&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;times&amp;nbsp;the&amp;nbsp;keystroke&amp;nbsp;is&amp;nbsp;auto-repeated&amp;nbsp;as&amp;nbsp;a&amp;nbsp;result&amp;nbsp;of&amp;nbsp;the&amp;nbsp;user&amp;nbsp;holding&amp;nbsp;down&amp;nbsp;the&amp;nbsp;key.&amp;nbsp;If&amp;nbsp;the&amp;nbsp;keystroke&amp;nbsp;is&amp;nbsp;held&amp;nbsp;long&amp;nbsp;enough,&amp;nbsp;multiple&amp;nbsp;messages&amp;nbsp;are&amp;nbsp;sent.&amp;nbsp;However,&amp;nbsp;the&amp;nbsp;repeat&amp;nbsp;count&amp;nbsp;is&amp;nbsp;not&amp;nbsp;cumulative.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td width="16%" style="font-size: 12px; "&gt;16&amp;#8211;23&lt;/td&gt;&lt;td width="84%" style="font-size: 12px; "&gt;Specifies&amp;nbsp;the&amp;nbsp;scan&amp;nbsp;code.&amp;nbsp;The&amp;nbsp;value&amp;nbsp;depends&amp;nbsp;on&amp;nbsp;the&amp;nbsp;original&amp;nbsp;equipment&amp;nbsp;manufacturer&amp;nbsp;(OEM).&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td width="16%" style="font-size: 12px; "&gt;24&lt;/td&gt;&lt;td width="84%" style="font-size: 12px; "&gt;Specifies&amp;nbsp;whether&amp;nbsp;the&amp;nbsp;key&amp;nbsp;is&amp;nbsp;an&amp;nbsp;extended&amp;nbsp;key,&amp;nbsp;such&amp;nbsp;as&amp;nbsp;the&amp;nbsp;right-hand&amp;nbsp;alt&amp;nbsp;and&amp;nbsp;ctrl&amp;nbsp;keys&amp;nbsp;that&amp;nbsp;appear&amp;nbsp;on&amp;nbsp;an&amp;nbsp;enhanced&amp;nbsp;101-&amp;nbsp;or&amp;nbsp;102-key&amp;nbsp;keyboard.&amp;nbsp;The&amp;nbsp;value&amp;nbsp;is&amp;nbsp;1&amp;nbsp;if&amp;nbsp;it&amp;nbsp;is&amp;nbsp;an&amp;nbsp;extended&amp;nbsp;key;&amp;nbsp;otherwise,&amp;nbsp;it&amp;nbsp;is&amp;nbsp;0.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td width="16%" style="font-size: 12px; "&gt;25&amp;#8211;28&lt;/td&gt;&lt;td width="84%" style="font-size: 12px; "&gt;Reserved;&amp;nbsp;do&amp;nbsp;not&amp;nbsp;use.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td width="16%" style="font-size: 12px; "&gt;29&lt;/td&gt;&lt;td width="84%" style="font-size: 12px; "&gt;Specifies&amp;nbsp;the&amp;nbsp;context&amp;nbsp;code.&amp;nbsp;The&amp;nbsp;value&amp;nbsp;is&amp;nbsp;1&amp;nbsp;if&amp;nbsp;the&amp;nbsp;ALT&amp;nbsp;key&amp;nbsp;is&amp;nbsp;down&amp;nbsp;while&amp;nbsp;the&amp;nbsp;key&amp;nbsp;is&amp;nbsp;pressed;&amp;nbsp;it&amp;nbsp;is&amp;nbsp;0&amp;nbsp;if&amp;nbsp;the&amp;nbsp;WM_SYSKEYDOWN&amp;nbsp;message&amp;nbsp;is&amp;nbsp;posted&amp;nbsp;to&amp;nbsp;the&amp;nbsp;active&amp;nbsp;window&amp;nbsp;because&amp;nbsp;no&amp;nbsp;window&amp;nbsp;has&amp;nbsp;the&amp;nbsp;keyboard&amp;nbsp;focus.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td width="16%" style="font-size: 12px; "&gt;30&lt;/td&gt;&lt;td width="84%" style="font-size: 12px; "&gt;Specifies&amp;nbsp;the&amp;nbsp;previous&amp;nbsp;key&amp;nbsp;state.&amp;nbsp;The&amp;nbsp;value&amp;nbsp;is&amp;nbsp;1&amp;nbsp;if&amp;nbsp;the&amp;nbsp;key&amp;nbsp;is&amp;nbsp;down&amp;nbsp;before&amp;nbsp;the&amp;nbsp;message&amp;nbsp;is&amp;nbsp;sent,&amp;nbsp;or&amp;nbsp;it&amp;nbsp;is&amp;nbsp;0&amp;nbsp;if&amp;nbsp;the&amp;nbsp;key&amp;nbsp;is&amp;nbsp;up.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td width="16%" style="font-size: 12px; "&gt;31&lt;/td&gt;&lt;td width="84%" style="font-size: 12px; "&gt;Specifies&amp;nbsp;the&amp;nbsp;transition&amp;nbsp;state.&amp;nbsp;The&amp;nbsp;value&amp;nbsp;is&amp;nbsp;always&amp;nbsp;0&amp;nbsp;for&amp;nbsp;a&amp;nbsp;WM_SYSKEYDOWN&amp;nbsp;message.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;0-15位：指定当前消息的重复次数。其值就是用户按下该键后自动重复的次数，但是重复次数不累积&lt;br /&gt;16-23位：指定其扫描码，其值依赖于OEM厂商&lt;br /&gt;24位：指定该按键是否为扩展按键，所谓扩展按键就是Ctrl,Alt之类的，如果是扩展按键，其值为1，否则为0&amp;nbsp;&lt;br /&gt;25-28位：保留字段，暂时不可用&amp;nbsp;&lt;br /&gt;29位：指定按键时的上下文，其值为1时表示在按键时Alt键被按下，其值为0表示WM_SYSKEYDOWN消息因没有任何窗口有键盘焦点而被发送到当前活动窗口。&amp;nbsp;&lt;br /&gt;30位：指定该按键之前的状态，其值为1时表示该消息发送前，该按键是被按下的，其值为0表示该消息发送前该按键是抬起的。&amp;nbsp;&lt;br /&gt;31位：指定其转换状态，对WM_SYSKEYDOWN消息而言，其值总为0。&lt;/p&gt;&lt;p&gt;具体可以参考&amp;nbsp;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms646286(en-us,VS.85).aspx" style="color: #1d58d1; text-decoration: none; "&gt;http://msdn.microsoft.com/zh-cn/library/ms646286(en-us,VS.85).aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;如果你想知道这些参数的含义 你可以直接输入1 就可以了表示按键的次数&lt;/p&gt;&lt;h1 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; font-size: 16px; padding-bottom: 5px; "&gt;lParam资讯&lt;/strong&gt;&lt;/p&gt;&lt;div class="text_pic" style="float: right; visibility: visible; "&gt;&lt;a href="http://imgsrc.baidu.com/baike/pic/item/9f1011b3a7e568b4d8335a71.jpg" target="_blank" style="color: #1d58d1; text-decoration: none; "&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sjzlxd/EntryImages/20090307/lParam.jpg" width="357" height="159" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div id="lemmaContent"&gt;在四个按键讯息（WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP）中，wParam讯息参数含有上面所讨论的虚拟键码，而lParam讯息参数则含有对了解按键非常有用的其他资讯。lParam的32位分为6个栏位，如图所示。&lt;br /&gt;在Win 3.x中，WPARAM是16位的，而LPARAM是32位的，两者有明显的区别。因为地址通常是32位的，所以LPARAM被用来传递地址，这个习惯在Win32 API中仍然能够看到。在Win32 API中，WPARAM和LPARAM都是32位，所以没有什么本质的区别。Windows的消息必须参考帮助文件才能知道具体的含义。如果是你定义的消息，愿意怎么使这两个参数都行。但是习惯上，我们愿意使用LPARAM传递地址，而WPARAM传递其他参数。&lt;/div&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/2226847.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2011/10/27/2226847.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2011/06/04/2072459.html</id><title type="text">System.Xml.XmlException: 根级别上的数据无效</title><summary type="text">使用Asp.net C#时.出现以下问题在以下代码中,运行进会抛出 [ System.Xml.XmlException: 根级别上的数据无效。] 的异常，问题 MemoryStream stream = new MemoryStream();XmlWriter w = XmlTextWriter.Create(stream); w.WriteStartDocument();w.WriteElementString("abc","test");w.WriteEndDocument(); w.Flush();w.Close(); string xml = E</summary><published>2011-06-04T00:26:00Z</published><updated>2011-06-04T00:26:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2011/06/04/2072459.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2011/06/04/2072459.html"/><content type="html">&lt;div&gt;&lt;div id="blog_text"&gt; &lt;p&gt;使用Asp.net C#时.出现以下问题&lt;br /&gt;在以下代码中,运行进会抛出 [ System.Xml.XmlException: 根级别上的数据无效。]  的异常，问题&lt;/p&gt; &lt;p&gt;MemoryStream stream = new MemoryStream();&lt;br /&gt;XmlWriter w =  XmlTextWriter.Create(stream);&lt;/p&gt; &lt;p&gt;w.WriteStartDocument();&lt;br /&gt;w.WriteElementString("abc","test");&lt;br /&gt;w.WriteEndDocument();&lt;/p&gt; &lt;p&gt;w.Flush();&lt;br /&gt;w.Close();&lt;/p&gt; &lt;p&gt;string xml = Encoding.UTF8.GetString(stream.ToArray());&lt;/p&gt; &lt;p&gt;XmlDocument xDoc = new XmlDocument();&lt;br /&gt;xDoc.LoadXml(xml);&lt;/p&gt; &lt;p&gt;经过仔细调试发现问题出现在. UTF8或者Unicode编码转换时，第一个字符转换会出现一个?号。&lt;br /&gt;所以，为避免异常。还应加上。&lt;/p&gt; &lt;p&gt;xml = xml.Substring(1, xml.Length - 1);&lt;/p&gt; &lt;p&gt;然后再 LoadXml(xml) 就不会出错了。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/2072459.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2011/06/04/2072459.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2011/03/19/1989065.html</id><title type="text">XP,WIN7双系统启动问题</title><summary type="text">楼主：原来安装了双xp，然后安装win7，如何让两个xp都可以直接从win7启动菜单直接启动？现在每次都要先进入earlier version windows，然后才能选择想进入的xp系统，觉得挺麻烦也浪费时间，想改成统一的启动菜单，不用象现在这样分为两级，怎么实现最好？xp在c和d盘各有一个，win7在e盘，试过把boot.inintldrntdetect.com拷贝到d盘，然后用bcdedit添加了从d盘启动，希望实现c盘d盘不同boot.ini来启动各自的xp，但是ntldr总是去读取c盘的boot.ini，所以实现不了原来的想法。请高手帮忙指点一下有什么好办法解决，谢谢。答案：学了电脑</summary><published>2011-03-19T13:09:00Z</published><updated>2011-03-19T13:09:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2011/03/19/1989065.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2011/03/19/1989065.html"/><content type="html">&lt;span class="Apple-style-span" style="word-spacing: 0px; font: medium 'Times New Roman'; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: verdana, 'courier new'"&gt;楼主：&lt;span&gt;原来安装了双xp，然后安装win7，如何让两个xp都可以直接从win7启动菜单直接启动？&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="message2004184"&gt;现在每次都要先进入earlier version windows，然后才能选择想进入的xp系统，觉得挺麻烦也浪费时间，想改成统一的启动菜单，不用象现在这样分为两级，怎么实现最好？&lt;br /&gt;&lt;br /&gt;xp在c和d盘各有一个，win7在e盘，试过把boot.ini&amp;nbsp;&amp;nbsp;ntldr&amp;nbsp;&amp;nbsp;ntdetect.com拷贝到d盘，然后用bcdedit添加了从d盘启动，希望实现c盘d盘不同boot.ini来启动各自的xp，但是ntldr总是去读取c盘的boot.ini，所以实现不了原来的想法。&lt;br /&gt;&lt;br /&gt;请高手帮忙指点一下有什么好办法解决，谢谢。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;答案：学了电脑报20100408-《颠覆传统，多系统启动不走寻常路》谈谈我对LZ这个问题的解答，尽管长了点，但是我认真准备的，权当自己好好地复习了一遍。不当之处请批评指正，这里的高手很多，班门弄斧了。&lt;/p&gt;&lt;span&gt;一、了解启动&lt;br /&gt;&amp;nbsp; &amp;nbsp; 1、系统启动顺序：开机自检-加载硬盘主引导记录（MBR）-搜索并激活系统引导文件-加载启动配置文件-加载系统核心文件-完成启动。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 2、winxp(2000)系统启动：开机自检-主引导记录（格式为NT52）-搜索并激活系统引导文件ntldr-加载启动配置文件-加载系统核心文件-完成启动。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 3、win7(vista)系统启动：开机自检-主引导记录（格式为NT60）-搜索并激活系统引导文件bootmgr-加载启动配置文件(c:\boot\bcd)-启动winload.exe-加载系统核心文件-完成启动。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 4、winxp基础上安装win7双系统的启动：开机自检-主引导记录（格式为NT60）-搜索并激活系统引导文件c:\bootmgr，并用bootmgr管理多系统启动-加载启动配置文件(c:\boot\bcd),并列出多重启动项目-（如果选择启动win7,则bootmgr会根据BCD启动信息配置将控制权交给win7目录下的winload.exe-加载系统核心文件-完成启动）（如果选择启动winxp，Bootmgr将控制权交给NTLDR-加载启动配置文件-加载系统核心文件-完成启动）。注：bootmgr可以启动xp和linux系统。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 按照楼主的要求，依照这样的思路来操作：不用已有的启动方式（也就是4），开机自检后能够直接管理2和3，也就是直接管理楼主机子的两个2、一个3；&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;二、具体操作&lt;br /&gt;&amp;nbsp; &amp;nbsp; ㈠实现各盘独立启动：&lt;br /&gt;&amp;nbsp; &amp;nbsp; 1、实现winxp独立启动：只要将硬盘主引导计录更改为NT52格式，即可c:\ntldr启动。方法如下：进入winxp，（网上下载bootsect.exe程序）把bootsect.exe复制到C盘，启动命令提示符工具并输入&amp;#8220;c:\bootsect.exe /nt52 c:&amp;#8221;，当屏幕出现&amp;#8220;Bootcode was successfully updated on all targeted volumes.&amp;#8221;的提示，则表示成功将主引导记录更改为NT52格式。重启系统后就可以直接自动加载NTLDR来启动WINXP了。这时，原有的启动方式4已经没有了。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 2、LZ是双XP，D盘也可同样操作。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 3、实现WIN7独立启动：只要将硬盘主引导计录更改为NT60，从引导文件bootmgr启动。方法如下：把&amp;#8220;c:bootmgr&amp;#8221;文件、&amp;#8220;c:\boot&amp;#8221;整个目录全部剪切到E盘根目录下。打开bcdtool.exe程序，单击&amp;#8220;启动配置-打开&amp;#8221;，打开&amp;#8220;E:\boot\bcd&amp;#8221;配置文件。依次选择&amp;#8220;编辑-删除启动项目&amp;#8221;，将原来的启动项目全部删除。接着再依次选择&amp;#8220;编辑-新建Vista启动项目&amp;#8221;，选中新建项目后，双击右侧窗格的&amp;#8220;device&amp;#8221;项，将其更改为&amp;#8220;partition=E:&amp;#8221;(win7安装的具体分区)，&amp;#8220;description&amp;#8221;更改为&amp;#8220;windows7&amp;#8221;。经过上述启动文件移动和配置后，只要能够加载&amp;#8220;E:\bootmgr&amp;#8221;,win7就可以从E盘启动了。（Bootmgr加载需要使用XRLDR程序的配置，软件网上可下载）。&lt;br /&gt;&amp;nbsp; &amp;nbsp; ㈡实现开机引导：&lt;br /&gt;&amp;nbsp; &amp;nbsp; 至此，各盘独立启动已分别设置好，只要有软件能够配置引导就行，引导到C就会启动C的XP,引导到D就会启动D的XP,引导到E就会启动E的WIN7。这个引导者就是XORLDR,使用XORLDR工具最后设定多系统统一管理：&lt;br /&gt;&amp;nbsp; &amp;nbsp; 进入WinXP系统，运行XORLDR程序（网上下载），单击&amp;#8220;安装/配置&amp;#8221;进入配置界面。在界面预览下选中&amp;#8220;第一操作系统&amp;#8221;依次进行如下设置：&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)启动方式单选&amp;#8220;从文件启动&amp;#8221;，启动文件选择NTLDR（用于启动WinXP，启动Win7选择Bootmgr）；&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)启动分区选择第一分区（即WinXP所在分区，其他系统根据具体分区选择）；&lt;br /&gt;&amp;nbsp; &amp;nbsp; (3)系统类型选择&amp;#8220;NTLDR/BOOTMGR&amp;#8221;，并勾选&amp;#8220;启动时激活要启动的主分区&amp;#8221;；&lt;br /&gt;&amp;nbsp; &amp;nbsp; (4)菜单文本更改为&amp;#8220;Windows XP&amp;#8221;，然后单击&amp;#8220;生成&amp;#8221;（字体等可以根据自己喜好设定），其他参数采取默认设置；&lt;br /&gt;&amp;nbsp; &amp;nbsp; (5)操作同上，依次设置Win7系统的启动配置，最后单击&amp;#8220;写入磁盘&amp;#8221;，完成对主引导记录的更改。&lt;br /&gt;&amp;nbsp; &amp;nbsp; 重新启动电脑就可以在开机多重启动菜单中选择自己喜欢的系统了（默认启动系统、等待时间可以在XORLDR中进行设置，下次启动时默认启动上次关机的系统）。&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 上述思路和做法也解决了C盘一坏，整个机器瘫痪的问题，各自独立，互不干扰。搞好以后各盘GHOST一次就行，包括其它的GHOST版WIN7也能顺利使用，恢复到E后（楼主的情况只能恢复到E，一般大家都是D）不用再去修改引导记录和向C盘COPY引导文件和配置文件。当然如果你想重装系统就要注意了，任何重装都可能修改主引导记录，所以此前我说了：搞好以后各盘GHOST一次，以后用镜像恢复，这不会破坏你辛辛苦苦写入的主引导记录，想玩装系统就用虚拟机吧。&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;楼主的三系统情况我没有试验，但这种思路绝对是可行的，如果你是双系统的话（C:XP，D:WIN7）肯定没问题，我的机器就是这样的。&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/1989065.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2011/03/19/1989065.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2011/01/09/1931164.html</id><title type="text">VM安装XP注意事项</title><summary type="text">1.没有分区时，GHOST是不能将系统装到C盘的2.没有将系统安装到C盘前，是不能设置C盘为作用的，否则重启直接进入C盘，会提示找不到操作系统。因此，安装的步骤应该是这样的：1.分区2.用GHOST将系统安装到C盘3.设置C盘为作用。</summary><published>2011-01-09T05:03:00Z</published><updated>2011-01-09T05:03:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2011/01/09/1931164.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2011/01/09/1931164.html"/><content type="html">&lt;p&gt;1.没有分区时，GHOST是不能将系统装到C盘的&lt;/p&gt;&lt;p&gt;2.没有将系统安装到C盘前，是不能设置C盘为作用的，否则重启直接进入C盘，会提示找不到操作系统。&lt;/p&gt;&lt;p&gt;因此，安装的步骤应该是这样的：&lt;/p&gt;&lt;p&gt;1.分区&lt;/p&gt;&lt;p&gt;2.用GHOST将系统安装到C盘&lt;/p&gt;&lt;p&gt;3.设置C盘为作用。&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/1931164.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2011/01/09/1931164.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2010/11/12/1875874.html</id><title type="text">VC 命令行 捕获输出</title><summary type="text">代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt;STARTUPINFOsi;//启动信息PROCESS_INFORMATIONpi;//进程信息si.cb=sizeof(STARTUPINFO);GetStartupInfo(&amp;si);/...</summary><published>2010-11-12T09:00:00Z</published><updated>2010-11-12T09:00:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2010/11/12/1875874.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2010/11/12/1875874.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('d7a40556-6999-4da8-a2e6-13580c6ec8ec')"&gt;&lt;img class="code_img_closed" id="code_img_closed_d7a40556-6999-4da8-a2e6-13580c6ec8ec" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /&gt;&lt;img class="code_img_opened" id="code_img_opened_d7a40556-6999-4da8-a2e6-13580c6ec8ec" style="display: none" onclick="cnblogs_code_hide('d7a40556-6999-4da8-a2e6-13580c6ec8ec',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &lt;div class="cnblogs_code_hide" id="cnblogs_code_open_d7a40556-6999-4da8-a2e6-13580c6ec8ec"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STARTUPINFO&amp;nbsp;&amp;nbsp;&amp;nbsp;si;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;启动信息&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PROCESS_INFORMATION&amp;nbsp;&amp;nbsp;&amp;nbsp;pi;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;进程信息&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;si.cb&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000"&gt;(STARTUPINFO);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetStartupInfo(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;si);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;取得当前进程的StartupInfo,并根据当前进程进行修改&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;si.hStdError&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hWrite;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;错误输出&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;si.hStdOutput&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hWrite;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;标准输出&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;si.wShowWindow&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SW_HIDE;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;si.dwFlags&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;STARTF_USESHOWWINDOW&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;STARTF_USESTDHANDLES;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CString&amp;nbsp;strCmdLine&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;cmd&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;创建子进程&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;CreateProcess(NULL,&amp;nbsp;strCmdLine.GetBuffer(),NULL,NULL,TRUE,NULL,NULL,NULL,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;si,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;pi))&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;创建进程失败!&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(hWrite);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sleep(&lt;/span&gt;&lt;span style="color: #800080"&gt;200&lt;/span&gt;&lt;span style="color: #000000"&gt;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer[&lt;/span&gt;&lt;span style="color: #800080"&gt;4096&lt;/span&gt;&lt;span style="color: #000000"&gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;};&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;bytesRead;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ReadFile(hRead,buffer,&lt;/span&gt;&lt;span style="color: #800080"&gt;4095&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;bytesRead,NULL)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CString&amp;nbsp;strInfo;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetDlgItemText(IDC_EDIT_Info,strInfo);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strInfo&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffer;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetDlgItemText(IDC_EDIT_Info,strInfo);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;TRACE(buffer);&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(hRead);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/1875874.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2010/11/12/1875874.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2010/11/09/1872384.html</id><title type="text">make 信息重定向</title><summary type="text">以下内容来自：《joyfire 笔记》 http://joyfire.net/jln/index.html1. 标准输入的控制语法：命令&lt; 文件将文件做为命令的输入。例如：mail -s “mail test” wesongzhou@hotmail.com &lt; file1 将文件file1 当做信件的内容，主题名称为mail test，送给收信人。2. 标准输出...</summary><published>2010-11-09T02:42:00Z</published><updated>2010-11-09T02:42:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2010/11/09/1872384.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2010/11/09/1872384.html"/><content type="html">&lt;p&gt;以下内容来自：《joyfire 笔记》 &lt;a href="http://joyfire.net/jln/index.html"&gt;http://joyfire.net/jln/index.html&lt;/a&gt;&lt;br /&gt;1. 标准输入的控制&lt;br /&gt;语法：命令&amp;lt; 文件将文件做为命令的输入。&lt;br /&gt;例如：&lt;br /&gt;mail -s &amp;#8220;mail test&amp;#8221; &lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#119;&amp;#101;&amp;#115;&amp;#111;&amp;#110;&amp;#103;&amp;#122;&amp;#104;&amp;#111;&amp;#117;&amp;#64;&amp;#104;&amp;#111;&amp;#116;&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#46;&amp;#99;&amp;#111;&amp;#109;"&gt;wesongzhou@hotmail.com&lt;/a&gt; &amp;lt; file1 将文件file1 当做信件的内容，主&lt;br /&gt;题名称为mail test，送给收信人。&lt;br /&gt;2. 标准输出的控制&lt;br /&gt;语法：命令&amp;gt; 文件将命令的执行结果送至指定的文件中。&lt;br /&gt;例如:&lt;br /&gt;ls -l &amp;gt; list 将执行&amp;#8220;ls -l&amp;#8221; 命令的结果写入文件list 中。&lt;br /&gt;语法：命令&amp;gt;! 文件将命令的执行结果送至指定的文件中，若文件已经存在，则覆盖。&lt;br /&gt;例如：&lt;br /&gt;ls -lg &amp;gt;! list 将执行&amp;#8220;ls - lg&amp;#8221; 命令的结果覆盖写入文件list 中。&lt;br /&gt;语法：命令&amp;gt;&amp;amp; 文件将命令执行时屏幕上所产生的任何信息写入指定的文件中。&lt;br /&gt;例如：&lt;br /&gt;cc file1.c &amp;gt;&amp;amp; error 将编译file1.c 文件时所产生的任何信息写入文件error 中。&lt;br /&gt;语法：命令&amp;gt;&amp;gt; 文件将命令执行的结果附加到指定的文件中。&lt;br /&gt;例如:&lt;br /&gt;ls - lag &amp;gt;&amp;gt; list 将执行&amp;#8220;ls - lag&amp;#8221; 命令的结果附加到文件list 中。&lt;br /&gt;语法：命令&amp;gt;&amp;gt;&amp;amp; 文件将命令执行时屏幕上所产生的任何信息附加到指定的文件中。&lt;br /&gt;例如:&lt;br /&gt;cc file2.c &amp;gt;&amp;gt;&amp;amp; error 将编译file2.c 文件时屏幕所产生的任何信息附加到文件error 中。&lt;/p&gt;&lt;p&gt;关于输入、输出和错误输出&lt;br /&gt;在字符终端环境中，标准输入/标准输出的概念很好理解。输入即指对一个应用程序或命令的输入，无论是从键盘输入还是从别的文件输入；输出即指应用程序或命令产生的一些信息；与 Windows 系统下不同的是，Linux 系统下还有一个标准错误输出的概念，这个概念主要是为程序调试和系统维护目的而设置的，错误输出于标准输出分开可以让一些高级的错误信息不干扰正常的输出信息，从而方便一般用户的使用。&lt;br /&gt;在 Linux 系统中：标准输入(stdin)默认为键盘输入；标准输出(stdout)默认为屏幕输出；标准错误输出(stderr)默认也是输出到屏幕（上面的 std 表示 standard）。在 BASH 中使用这些概念时一般将标准输出表示为 1，将标准错误输出表示为 2。下面我们举例来说明如何使用他们，特别是标准输出和标准错误输出。&lt;/p&gt;&lt;p&gt;输入、输出及标准错误输出主要用于 I/O 的重定向，就是说需要改变他们的默认设置。先看这个例子：&lt;/p&gt;&lt;p&gt;$ ls &amp;gt; ls_result&lt;br /&gt;$ ls -l &amp;gt;&amp;gt; ls_result&lt;/p&gt;&lt;p&gt;上面这两个命令分别将 ls 命令的结果输出重定向到 ls_result 文件中和追加到 ls_result 文件中，而不是输出到屏幕上。"&amp;gt;"就是输出（标准输出和标准错误输出）重定向的代表符号，连续两个 "&amp;gt;" 符号，即 "&amp;gt;&amp;gt;" 则表示不清除原来的而追加输出。下面再来看一个稍微复杂的例子：&lt;/p&gt;&lt;p&gt;$ find /home -name lost* 2&amp;gt; err_result&lt;/p&gt;&lt;p&gt;这个命令在 "&amp;gt;" 符号之前多了一个 "2"，"2&amp;gt;" 表示将标准错误输出重定向。由于 /home 目录下有些目录由于权限限制不能访问，因此会产生一些标准错误输出被存放在 err_result 文件中。大家可以设想一下 find /home -name lost* 2&amp;gt;&amp;gt;err_result 命令会产生什么结果？&lt;/p&gt;&lt;p&gt;如果直接执行 find /home -name lost* &amp;gt; all_result ，其结果是只有标准输出被存入 all_result 文件中，要想让标准错误输出和标准输入一样都被存入到文件中，那该怎么办呢？看下面这个例子：&lt;/p&gt;&lt;p&gt;$ find /home -name lost* &amp;gt; all_result 2&amp;gt;&amp;amp; 1&lt;/p&gt;&lt;p&gt;上面这个例子中将首先将标准错误输出也重定向到标准输出中，再将标准输出重定向到 all_result 这个文件中。这样我们就可以将所有的输出都存储到文件中了。为实现上述功能，还有一种简便的写法如下：&lt;/p&gt;&lt;p&gt;$ find /home -name lost* &amp;gt;&amp;amp; all_result&lt;/p&gt;&lt;p&gt;如果那些出错信息并不重要，下面这个命令可以让你避开众多无用出错信息的干扰：&lt;/p&gt;&lt;p&gt;$ find /home -name lost* 2&amp;gt; /dev/null&lt;/p&gt;&lt;p&gt;同学们回去后还可以再试验一下如下几种重定向方式，看看会出什么结果，为什么？&lt;/p&gt;&lt;p&gt;$ find /home -name lost* &amp;gt; all_result 1&amp;gt;&amp;amp; 2&lt;br /&gt;$ find /home -name lost* 2&amp;gt; all_result 1&amp;gt;&amp;amp; 2&lt;br /&gt;$ find /home -name lost* 2&amp;gt;&amp;amp; 1 &amp;gt; all_result&lt;/p&gt;&lt;p&gt;另外一个非常有用的重定向操作符是 "-"，请看下面这个例子：&lt;/p&gt;&lt;p&gt;$ (cd /source/directory &amp;amp;&amp;amp; tar cf - . ) | (cd /dest/directory &amp;amp;&amp;amp; tar xvfp -)&lt;/p&gt;&lt;p&gt;该命令表示把 /source/directory 目录下的所有文件通过压缩和解压，快速的全部移动到 /dest/directory 目录下去，这个命令在 /source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。&lt;/p&gt;&lt;p&gt;下面还几种不常见的用法：&lt;/p&gt;&lt;p&gt;n&amp;lt;&amp;amp;- 表示将 n 号输入关闭&lt;br /&gt;&amp;lt;&amp;amp;- 表示关闭标准输入（键盘）&lt;br /&gt;n&amp;gt;&amp;amp;- 表示将 n 号输出关闭&lt;br /&gt;&amp;gt;&amp;amp;- 表示将标准输出关闭&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/1872384.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2010/11/09/1872384.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2010/11/01/1866272.html</id><title type="text">VC 进度条制件CProgressCtrl 用法笔记</title><summary type="text">CProgressCtrl 用法：参数：nStep新的步增量。说明：此函数为进度条控件指定步增量。步增量就是每调用一次CProgressCtrl::StepIt所增加进度条控件的当前位置的数量。缺省的步增量是104.m_Propress.StepIt()//动起来返回值：返回进度条控件的原来的位置。说明：此函数用步增量来增加一个进度条控件的当前位置。该步增量由成员函数CProgressCtrl::...</summary><published>2010-11-01T07:34:00Z</published><updated>2010-11-01T07:34:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2010/11/01/1866272.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2010/11/01/1866272.html"/><content type="html">&lt;p&gt;CProgressCtrl 用法：&lt;/p&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 22px; "&gt;m_progress是进度条关联的成员变量。1.m_progress.&lt;span style="color: #ff0000; "&gt;SetRange&lt;/span&gt;(0,100);//设置范围&lt;br/&gt;2.m_progress.&lt;span style="color: #ff0000; "&gt;SetPos&lt;/span&gt;(0);//设置位置&lt;span class="Apple-style-span" style="font-family: 宋体; line-height: normal; white-space: normal; font-size: 12px; "&gt;返回值：返回进度条控件的早先的位置。&lt;br /&gt;参数：&lt;table cellspacing="0" cellpadding="3"&gt;&lt;tbody&gt;&lt;tr valign="top"&gt;&lt;td style="font-family: 宋体; font-size: 12px; "&gt;nPos&lt;/td&gt;&lt;td style="font-family: 宋体; font-size: 12px; "&gt;进度条控件的新位置。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;说明：&lt;br /&gt;此成员函数根据nPos指定的位置来设置进度条控件的当前位置，并重画此进度条来反映新的位置。&lt;br /&gt;进度条的这个位置不是它在屏幕上的物理位置，而是在SetRange中的上限和下限范围之间的位置。&lt;/span&gt;&lt;br/&gt;3.m_progress.&lt;span style="color: #ff0000; "&gt;SetStep&lt;/span&gt;(0);&amp;nbsp;//&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;参数：&lt;/span&gt;&lt;table cellspacing="0" cellpadding="3" style="font-family: 宋体; font-size: 12px; "&gt;&lt;tbody&gt;&lt;tr valign="top"&gt;&lt;td style="font-family: 宋体; font-size: 12px; "&gt;nStep&lt;/td&gt;&lt;td style="font-family: 宋体; font-size: 12px; "&gt;新的步增量。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;说明：&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;此函数为进度条控件指定步增量。步增量就是每调用一次CProgressCtrl::StepIt所增加进度条控件的当前位置的数量。缺省的步增量是&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; color: #ff0000; "&gt;10&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4.&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;m_Propress.StepIt()//动起来&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;返回值：返回进度条控件的原来的位置。&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;说明：&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; font-size: 12px; "&gt;此函数用步增量来增加一个进度条控件的当前位置。该步增量由成员函数CProgressCtrl::SetStep来设定。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font class="Apple-style-span" face="Arial" size="4"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 22px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/1866272.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2010/11/01/1866272.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2010/07/29/1788234.html</id><title type="text">VC List Control控件高级使用</title><summary type="text">最近使用到了List Control控件。使用中，要求不但能够在List Control中显示数据，而且能够动态修改选中的Item中的内容，其功能类似与在程序中插入一张可以随意修改的表（Table）。虽然整个过程很简单，却体现了MFC编程的灵活性。通过实现高级List Control控件，也可以从更深层次理解MFC界面编程。下面将实现步骤总结如下：这里我们来实现一个自己的类CEditTable，该...</summary><published>2010-07-29T13:48:00Z</published><updated>2010-07-29T13:48:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2010/07/29/1788234.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2010/07/29/1788234.html"/><content type="html">&lt;p&gt;最近使用到了List Control控件。使用中，要求不但能够在List Control中显示数据，而且能够动态修改选中的Item中的内容，其功能类似与在程序中插入一张可以随意修改的表（Table）。虽然整个过程很简单，却体现了MFC编程的灵活性。通过实现高级List Control控件，也可以从更深层次理解MFC界面编程。&lt;br /&gt;下面将实现步骤总结如下：&lt;br /&gt;这里我们来实现一个自己的类CEditTable，该类继承与CListCtrl。&lt;br /&gt;先说一下我们的思路：CListCtrl类给提供了现实数据的基本操作，但要像Word中编辑表格一样编辑ClistCtrl中的内容，首先必须获取要编辑的Item的位置，然后用新输入的内容代替原来Item中的内容。基本思路很简单，就是先触发输入操作，然后新建一个CEdit编辑框对象，从CEdit编辑框中获取新的内容，以新内容替换指定Item中的内容，回车结束，销毁CEdit编辑框对象。下面来一步步实现。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;1．&amp;nbsp; 从CEdit控件继承一个CItemEdit类，作为CListCtrl的成员，用来接收输入内容。&lt;br /&gt;2．&amp;nbsp; 重载CEdit的消息翻译函数BOOL PreTranslateMessage(MSG* pMsg); 在函数中拦截ESC键和RETURN键按下的消息，解释为WM_KILLFOCUS消息（ESC和ENTER分别表示取消输入和输入结束）&lt;br /&gt;BOOL CItemEdit::PreTranslateMessage(MSG* pMsg)&amp;nbsp; &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //拦截ESC键和RETURN键按下的消息，解释为WM_KILLFOCUS消息，这里也可以根据需要设置其它键作为输入结束或取消输入的标志&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( pMsg-&amp;gt;message==WM_KEYDOWN )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( pMsg-&amp;gt;wParam==13 )&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //回车键 &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMsg-&amp;gt;message = WM_KILLFOCUS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if( pMsg-&amp;gt;wParam==27 )&amp;nbsp;&amp;nbsp;&amp;nbsp; //ESC键&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_bInputValid = FALSE;&amp;nbsp;&amp;nbsp;&amp;nbsp; //此时的编辑结果无效&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMsg-&amp;gt;message = WM_KILLFOCUS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return CEdit::PreTranslateMessage(pMsg);&lt;br /&gt;}&lt;br /&gt;3. 重载OnKillFocus函数&lt;br /&gt;void CItemEdit::OnKillFocus(CWnd* pNewWnd) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 得到父窗口，并通知父窗口结束编辑过程&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lj_CListCtrl *parent = (lj_CListCtrl *)GetParent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( parent )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parent-&amp;gt;MyEndEdit( m_bInputValid ); &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_bInputValid = TRUE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CEdit::OnKillFocus(pNewWnd);&lt;br /&gt;}&lt;br /&gt;4.&amp;nbsp;&amp;nbsp; 从CListCtrl类继承新的CEditTable类&lt;br /&gt;5.&amp;nbsp;&amp;nbsp; 在CEditTable中分别添加编辑控件成员 CItemEdit&amp;nbsp; m_edit; 便是行和列的坐标变量&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int m_nItem;&amp;nbsp;&amp;nbsp; //被编辑表项的行号&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int m_nSubItem; //列号 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;6.&amp;nbsp;&amp;nbsp; 在CEditTable中重载鼠标左键按下消息的回调函数 void OnLButtonDown(UINT nFlags, CPoint point);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 应用中要通过点击鼠标左键开始编辑Table中的某一项。&lt;br /&gt;void CEditTable::OnLButtonDown(UINT nFlags, CPoint point) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; POSITION pos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOL bSelected = FALSE; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 检查是否有Item正被编辑&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( m_bEditing ==TRUE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto defalt_session;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 检查是否有Item被选中，没有时不进入编辑 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = GetFirstSelectedItemPosition();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( pos )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 得到被点击的Item&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVHITTESTINFO testinfo;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; testinfo.pt.x = point.x; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; testinfo.pt.y = point.y;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //点击时的鼠标位置&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; testinfo.flags = LVHT_ONITEMLABEL;&amp;nbsp;&amp;nbsp;&amp;nbsp; //点击的必须是标题&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( SubItemHitTest(&amp;amp;testinfo)&amp;lt;0 ) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto defalt_session;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //没有点在有效区域，不进入编辑&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_nItem = testinfo.iItem;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //被点击表项的行号&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_nSubItem = testinfo.iSubItem;&amp;nbsp;&amp;nbsp;&amp;nbsp; //被点击表项的列号 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if(m_nSubItem == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //goto defalt_session;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //选中第一列，不编辑 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 检查该表项是否被选中，没被选中不进入编辑&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( pos )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( m_nItem==GetNextSelectedItem(pos) ) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bSelected = TRUE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( bSelected==FALSE ) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto defalt_session;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //没有点在有效区域，不编辑&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 开始编辑&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_bEditing = BeginEdit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;defalt_session:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CListCtrl::OnLButtonDown(nFlags, point);&lt;br /&gt;}&lt;br /&gt;7.&amp;nbsp;&amp;nbsp; 添加开始编辑函数BOOL BeginEdit();&amp;nbsp; 完成新建CEdit对象、获取Edit输入文字等功能&lt;br /&gt;BOOL CEditTable::BeginEdit() &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 得到被编辑表项的区域&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRect rect;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( GetSubItemRect(m_nItem, m_nSubItem, LVIR_LABEL, rect)==FALSE )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 创建编辑控件&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int style =&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_CHILD | &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_CLIPSIBLINGS |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_EX_TOOLWINDOW | &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_BORDER;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( m_edit.Create(style, rect, this, ID_MYEDIT)==FALSE )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FALSE; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 取被编辑表项的文字&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CString txtItem = GetItemText( m_nItem, m_nSubItem );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 取出的文字填写到编辑控件&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_edit.SetWindowText( txtItem ); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_edit.SetFocus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_edit.SetSel( 0, -1 );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_edit.ShowWindow( SW_SHOW );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE; &lt;/p&gt;&lt;p&gt;}&lt;br /&gt;8.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 添加结束编辑函数 void EndEdit( BOOL bValidate );&amp;nbsp; 主要完成 替换Item内容、销毁编辑框等功能。&lt;br /&gt;void CEditTable::EndEdit( BOOL bValidate )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 编辑结果是有效的，重设被编辑表项的文字 &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( bValidate )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CString txtItem;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_edit.GetWindowText( txtItem );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetItemText(m_nItem, m_nSubItem, txtItem);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 销毁编辑窗口 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_edit.DestroyWindow();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_bEditing = FALSE;&lt;br /&gt;}&lt;br /&gt;本篇文章来源于 www.87717.com 原文链接：http://www.87717.com/vc/vc_11899_2.html&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/1788234.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2010/07/29/1788234.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2010/07/19/1780565.html</id><title type="text">List Control 控件技巧总汇</title><summary type="text">List Control 控件技巧总汇 以下未经说明，listctrl 默认view 风格为report-------------------------------------------------------------------------------1. CListCtrl 风格 LVS_ICON: 为每个item显示大图标 LVS_SMALLICON: 为每个item显示小图标 LV...</summary><published>2010-07-19T03:59:00Z</published><updated>2010-07-19T03:59:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2010/07/19/1780565.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2010/07/19/1780565.html"/><content type="html">List Control 控件技巧总汇 &lt;div id="app-share-container"&gt;&lt;div id="appShareOpt"&gt;&lt;/div&gt;&lt;div id="app-share-content"&gt;&lt;p&gt;以下未经说明，listctrl 默认view 风格为report&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;1. CListCtrl 风格&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVS_ICON: 为每个item显示大图标&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVS_SMALLICON: 为每个item显示小图标&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVS_LIST: 显示一列带有小图标的item&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVS_REPORT: 显示item详细资料&lt;/p&gt;&lt;p&gt;直观的理解：windows资源管理器，"查看"标签下的"大图标，小图标，列表，详细资料&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;2. 设置listctrl 风格及扩展风格&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG lStyle;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lStyle &amp;amp;= ~LVS_TYPEMASK; //清除显示方式位&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lStyle |= LVS_REPORT; //设置style&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwStyle = m_list.GetExtendedStyle();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮（只适用与report风格的listctrl）&lt;/p&gt;&lt;p&gt;dwStyle |= LVS_EX_GRIDLINES;//网格线（只适用与report风格的listctrl）&lt;/p&gt;&lt;p&gt;dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件&lt;/p&gt;&lt;p&gt;m_list.SetExtendedStyle(dwStyle); //设置扩展风格&lt;/p&gt;&lt;p&gt;注：listview的style请查阅msdn&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a&gt;&lt;font color="#4c7d08"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;3. 插入数据&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nRow = m_list.InsertItem(0, "11");//插入行&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.SetItemText(nRow, 1, "jacky");//设置数据&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;4. 一直选中item&lt;/p&gt;&lt;p&gt;选中style中的Show selection always，或者在上面第2点中设置LVS_SHOWSELALWAYS&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;5. 选中和取消选中一行&lt;/p&gt;&lt;p&gt;int nIndex = 0;&lt;/p&gt;&lt;p&gt;//选中&lt;/p&gt;&lt;p&gt;m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);&lt;/p&gt;&lt;p&gt;//取消选中&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;6. 得到listctrl中所有行的checkbox的状态&lt;/p&gt;&lt;p&gt;m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);&lt;/p&gt;&lt;p&gt;CString str;&lt;/p&gt;&lt;p&gt;for(int i=0; i&amp;lt;m_list.GetItemCount(); i++)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;str.Format(_T("第%d行的checkbox为选中状态"), i);&lt;/p&gt;&lt;p&gt;AfxMessageBox(str);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;7. 得到listctrl中所有选中行的序号&lt;/p&gt;&lt;p&gt;方法一：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CString str;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0; i&amp;amp;lt;m_list.GetItemCount(); i++)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str.Format(_T("选中了第%d行"), i);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AfxMessageBox(str);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;方法二：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POSITION pos = m_list.GetFirstSelectedItemPosition();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pos == NULL)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRACE0("No items were selected!\n");&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (pos)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nItem = m_list.GetNextSelectedItem(pos);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TRACE1("Item %d was selected!\n", nItem);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // you could do your own processing on nItem here&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;8. 得到item的信息&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR szBuf[1024];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVITEM lvi;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvi.iItem = nItemIndex;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvi.iSubItem = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvi.mask = LVIF_TEXT;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvi.pszText = szBuf;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvi.cchTextMax = 1024;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.GetItem(&amp;amp;lvi);&lt;/p&gt;&lt;p&gt;关于得到设置item的状态，还可以参考msdn文章&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Q173242: Use Masks to Set/Get Item States in ClistCtrl&lt;/p&gt;&lt;p&gt;&lt;a&gt;&lt;font color="#4c7d08"&gt;http://support.microsoft.com/kb/173242/en-us&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;9. 得到listctrl的所有列的header字符串内容&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVCOLUMN lvcol;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char&amp;nbsp;&amp;nbsp; str[256];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp; nColNum;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CString&amp;nbsp;&amp;nbsp; strColumnName[4];//假如有4列&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nColNum = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvcol.mask = LVCF_TEXT;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvcol.pszText = str;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvcol.cchTextMax = 256;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(m_list.GetColumn(nColNum, &amp;amp;lvcol))&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strColumnName[nColNum] = lvcol.pszText;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nColNum++;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;10. 使listctrl中一项可见，即滚动滚动条&lt;/p&gt;&lt;p&gt;m_list.EnsureVisible(i, FALSE);&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;11. 得到listctrl列数&lt;/p&gt;&lt;p&gt;int nHeadNum = m_list.GetHeaderCtrl()-&amp;gt;GetItemCount();&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;12. 删除所有列&lt;/p&gt;&lt;p&gt;方法一：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( m_list.DeleteColumn (0))&lt;/p&gt;&lt;p&gt;因为你删除了第一列后，后面的列会依次向上移动。&lt;/p&gt;&lt;p&gt;方法二：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nColumns = 4;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i=nColumns-1; i&amp;amp;gt;=0; i--)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.DeleteColumn (i);&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;13. 得到单击的listctrl的行列号&lt;/p&gt;&lt;p&gt;添加listctrl控件的NM_CLICK消息相应函数&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 方法一：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwPos = GetMessagePos();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.ScreenToClient(&amp;amp;point);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVHITTESTINFO lvinfo;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvinfo.pt = point;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvinfo.flags = LVHT_ABOVE;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nItem = m_list.SubItemHitTest(&amp;amp;lvinfo);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(nItem != -1)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CString strtemp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AfxMessageBox(strtemp);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 方法二:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pNMListView-&amp;amp;gt;iItem != -1)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CString strtemp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strtemp.Format("单击的是第%d行第%d列",&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNMListView-&amp;amp;gt;iItem, pNMListView-&amp;amp;gt;iSubItem);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AfxMessageBox(strtemp);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pResult = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;14. 判断是否点击在listctrl的checkbox上&lt;/p&gt;&lt;p&gt;添加listctrl控件的NM_CLICK消息相应函数&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;DWORD dwPos = GetMessagePos();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_list.ScreenToClient(&amp;amp;point);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LVHITTESTINFO lvinfo;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvinfo.pt = point;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lvinfo.flags = LVHT_ABOVE;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT nFlag;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nItem = m_list.HitTest(point, &amp;amp;nFlag);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //判断是否点在checkbox上&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(nFlag == LVHT_ONITEMSTATEICON)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AfxMessageBox("点在listctrl的checkbox上");&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pResult = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;15. 右键点击listctrl的item弹出菜单&lt;/p&gt;&lt;p&gt;添加listctrl控件的NM_RCLICK消息相应函数&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pNMListView-&amp;amp;gt;iItem != -1)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwPos = GetMessagePos();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CMenu menu;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VERIFY( menu.LoadMenu( IDR_MENU1 ) );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CMenu* popup = menu.GetSubMenu(0);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ASSERT( popup != NULL );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; popup-&amp;amp;gt;TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pResult = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;16. item切换焦点时(包括用键盘和鼠标切换item时)，状态的一些变化顺序&lt;/p&gt;&lt;p&gt;添加listctrl控件的LVN_ITEMCHANGED消息相应函数&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO: Add your control notification handler code here&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CString sTemp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if((pNMListView-&amp;amp;gt;uOldState &amp;amp; LVIS_FOCUSED) == LVIS_FOCUSED &amp;amp;&amp;amp; (pNMListView-&amp;amp;gt;uNewState &amp;amp; LVIS_FOCUSED) == 0)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sTemp.Format("%d losted focus",pNMListView-&amp;amp;gt;iItem);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if((pNMListView-&amp;amp;gt;uOldState &amp;amp; LVIS_FOCUSED) == 0 &amp;amp;&amp;amp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (pNMListView-&amp;amp;gt;uNewState &amp;amp; LVIS_FOCUSED) == LVIS_FOCUSED)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sTemp.Format("%d got focus",pNMListView-&amp;amp;gt;iItem);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if((pNMListView-&amp;amp;gt;uOldState &amp;amp; LVIS_SELECTED) == LVIS_SELECTED &amp;amp;&amp;amp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (pNMListView-&amp;amp;gt;uNewState &amp;amp; LVIS_SELECTED) == 0)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sTemp.Format("%d losted selected",pNMListView-&amp;amp;gt;iItem);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;else if((pNMListView-&amp;amp;gt;uOldState &amp;amp; LVIS_SELECTED) == 0 &amp;amp;&amp;amp; (pNMListView-&amp;amp;gt;uNewState &amp;amp; LVIS_SELECTED) == LVIS_SELECTED)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;sTemp.Format("%d got selected",pNMListView-&amp;amp;gt;iItem);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;*pResult = 0;&lt;/p&gt;&lt;p&gt;本文出自 51CTO.COM技术博客 &lt;a target="_blank"&gt;&lt;font color="#4c7d08"&gt;浏览原文&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/ganmk/aggbug/1780565.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ganmk/archive/2010/07/19/1780565.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ganmk/archive/2009/11/25/1610293.html</id><title type="text">VC中字符串取子串总结</title><summary type="text">最近变成中经常用到字符串处理操作， 其中最多的就是从字符串中取子串了。今天正好看到这样一个帖子，总结的不错， 引进过来。------------------一。前言程序中经常会遇到要处理用某些符号（如空格，或“, ; . | \t”等）分隔的字符串的问题，我在此做了一些总结和比较。二。处理方法1. 用MFC CString之Find处理字符串// 以下方法将一个字符串分解后...</summary><published>2009-11-25T04:32:00Z</published><updated>2009-11-25T04:32:00Z</updated><author><name>凌点</name><uri>http://www.cnblogs.com/ganmk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ganmk/archive/2009/11/25/1610293.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ganmk/archive/2009/11/25/1610293.html"/><content type="text">最近变成中经常用到字符串处理操作， 其中最多的就是从字符串中取子串了。今天正好看到这样一个帖子，总结的不错， 引进过来。------------------一。前言程序中经常会遇到要处理用某些符号（如空格，或“, ; . | \t”等）分隔的字符串的问题，我在此做了一些总结和比较。二。处理方法1. 用MFC CString之Find处理字符串// 以下方法将一个字符串分解后...</content></entry></feed>
