查看完整版本: [-- [转]VC++入门教程(windows入门程序详解) --] ★广海社区★ - ghoffice.com -> ::::C++交流:::: -> [转]VC++入门教程(windows入门程序详解) [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题 菜鸟学挂 2010-01-21 11:27 p ~x gle_~es'K 我们既然用C语言进行,就选第一项"An empty project"...... K8ecSs}}J cAC]%~orx ......好累,这篇就写这么多吧,但愿对你有帮助,也建议多给我提意见,你的反馈是我最大的动力渊源...... Gp6|M2Vu_5 讲的不错吧~,还是比较好懂的.下面接着看. 要自己动手. &CV%+ pF,e gaC [%M r=Od % 第二只小板凳 Y0;66bfh} ]wHXrB8vx 打开VC,file-->new-->progects-->win32 application,并在project name 中输入hello.顺路走下来,选择第二项。在编辑器中输入以下程序覆盖向导产生的代码: yP*oRV%uX t+IrQf,P[ #i nclude "stdafx.h" //注意,这个向导产生的头文件不能去掉 =`/ GB T$ Y #bCzWg Pw/$ }Q9X WNDCLASS wc ; U~_G *0 9B2`FJ by* v($ wc.style = CS_HREDRAW | CS_VREDRAW ; d;E (^l !y7w~UVs wc.lpfnWndProc = WndProc ; Hg`2- Nl 7&*d]#&~j wc.cbClsExtra = 0 ; c2Up<#t L; 'C5#GN wc.cbWndExtra = 0 ; 28=L9q ~[`*)(4E wc.hInstance = hInstance ; \!!1o+#1j y];@ M<6u=g, {GM8}M~D& if (!RegisterClass (&wc)) |q*s)8 D‑sH`I %w{ { 1[r; I l,^/qvIY MessageBox (NULL, TEXT ("This program requires Windows NT!"),
x b1`(f "&l szAppName, MB_ICONERROR) ; uS *Gm6l vciO={M } z l.b g[L}puN int nCmdShow // show state %~ k9d \z int cbClsExtra ; //窗口类附加数据 Qgxp q{y i2X%xYv ^ int cbWndExtra ; //窗口附加数据 h Nx#x PAS0 D # HINSTANCE hInstance ; //拥有窗口类的实例句柄 nj6‑|WJ |: ,i HICON hIcon ; //最小窗口图标 x`JhNAO> rObg:(z&\ HCURSOR hCursor ; //窗口内使用的光标 >*Ctp +X@ 0$=w8tP) HBRUSH hbrBackground ; //用来着色窗口背景的刷子 T 7?cnK" !![‑HR6"Q LPCSTR lpszMenuName ; //指向菜单资源名的指针 |OBh:d_B] 74fE %;F LPCSTR lpszClassName ; // 指向窗口类名的指针 9i+.iuE%Bu |vtj0 ,[ } %/w%A:y#& cf,^7,-`" 在VC6.0里面,把光标定位在WNDCLASS上,按F1,即可启动MSDN,在MSDN里你可看到这个结构原形.在下节讲解这些参数在本程序中的具体用法. B3&C=*y /~3kkM(Ty (2)注册窗口类 _~bG[lX! ?H!QV;ku (1)第一个参数:成员style控制窗口的某些重要特性,在WINDOWS.H中定义了一些前缀为CS的常量,在程序中可组合使用这些常量.也可把sytle设为0.本程序中为wc.style = CS_HREDRAW | CS_VREDRAW,它表示当窗口的纵横坐标发生变化时要重画整个窗口。你看:无论你怎样拉动窗口的大小,那行字都会停留在窗口的正中部,而假如把这个参数设为0的话,当改动窗口的大小时,那行字则不一定处于中部了。 t&Jrch k 6cX Z3;a (2)第二个参数:lpfnWndProc包括一个指向该窗口类的消息处理函数的指针,此函数称为窗口过程函数。它将接收Windows发送给窗口的消息,并执行相应的任务。其原型为: =0mn6b9-= J+m1d\lBu long FAR PASCAL WndProc(HWND ,unsigned,WORD,LONG);并且必须在模快定义中回调它。WndProc是一个回调函数(见第五节),如果暂时无法理解这个模糊的概念意味着什么,可先放过,等到讲消息循环时再详谈。 `\yQn7 Oq 1!;4I@W(I) (3)第三,四个参数:cbWndExtra域指定用本窗口类建立的所有窗口结构分配的额外字节数。当有两个以上的窗口属于同一窗口类时,如果想将不同的数据和每个窗口分别相对应。则使用该域很有用。这般来讲,你只要把它们设为0就行了,不必过多考虑。 @T%8EiV r*UE>_3J (4)第五个参数:hInstance域标识应用程序的实例hInstance,当然,实例名是可以改变的。wc.hInstance = hInstance ;这一成员可使Windows连接到正确的程序。 mD7kOOMY 0Gmr (7)第八个参数:wc.hbrBackground域决定Windows用于着色窗口背景的刷子颜色,函数GetStockObject返回窗口的颜色,本程序中返回的是白色,你也可以把它改变为红色等其他颜色.试试看 wQYW5X (8)第九个参数:lpszMenuName用来指定菜单名,本程序中没有定义菜单,所以为NULL。 D!mx&O9 mXI'=Vo!S (9)第十个参数:lpszClassName指定了本窗口的类名。 ;0 -R"c)- ' ^(qlCI 当对WNDCLASS结构域一一赋值后,就可注册窗口类了,在创建窗口之前,是必须要注册窗口类的,注册窗口类用的API函数是RegisterClass,注册失败的话,就会出现一个对话框如程序所示,函数RegisterClass返回0值,也只能返回0值,因为注册不成功,程序已经不能再进行下去了。 Esf \Bo‑" m2[J5n?zLL 在本程序中注册窗口类如下: =lL)g"x X‑ {/i&o if (!RegisterClass (&wc)) { \pXo~;E\ \ lK ` MessageBox (NULL, TEXT ("This program requires Windows NT!"), _gQ_ixu l_pf9 a{X (三)显示和更新窗口 tgUh T ^P`I"T d 主窗口显示出来了,WinMain就开始处理消息了,怎么做的呢? ca[*#xiJ ssmJ?sl Windows为每个正在运行的应用程序都保持一个消息队列。当你按下鼠标或者键盘时,Windows并不是把这个输入事件直接送给应用程序,而是将输入的事件先翻译成一个消息,然后把这个消息放入到这个应用程序的消息队列中去。应用程序又是怎么来接收这个消息呢?这就讲讲消息循环了。 7w\!3pv !Wy&+‑H*0 应用程序的WinMain函数通过执行一段代码从她的队列中来检索Windows送往她的消息。然后WinMain就把这些消息分配给相应的窗口函数以便处理它们,这段代码是一段循环代码,故称为"消息循环"。这段循环代码是什么呢?好,往下看: Ko "JH=< 5oOs.(m|*C 在咱们的第二只小板凳中,这段代码就是: F |_mCwA iMv9 ||k^pzj% LPARAM lParam; fj]) *1;}c z DWORD time; ySwvjP7f R%N&Y~zH POINT pt; `l95I‑7 &‑U8W(NxN } MSG, *PMSG; NI136P v-@xO&< MSG数据成员意义如下: Q2[D 再次申明,不是我写的。觉得作者写的好转过来和大家一起分享。 _gK@),de O^I~d{M 5I 第三讲:Windows消息机制(3) 9)Y]05us ~a‑8J"Wh (五)终止应用程序: @ 6>R /] KU VsCmiT Windows是一种非剥夺式多任务操作系统。只有的应用程序交出CPU控制权后,Windows才能把控制权交给其他应用程序。当GetMessage函数找不到等待应用程序处理的消息时,自动交出控制权,Windows把CPU的控制权交给其他等待控制权的应用程序。由于每个应用程序都有一个消息循环,这种隐式交出控制权的方式保证合并各个应用程序共享控制权。一旦发往该应用程序的消息到达应用程序队列,即开始执行GetMessage语句的下一条语句。 ho2o/>Ef3 !'Xk=+ 当WinMain函数把控制返回到Windows时,应用程序就终止了。应用程序的启动消息循环前要检查引导出消息循环的每一步,以确保每个窗口已注册,每个窗口都已创建。如存在一个错误,应用程序应返回控制权,并显示一条消息。 X&h4A4#P WEUr;f 但是,一旦WinMain函数进入消息循环,终止应用程序的唯一办法就是使用PostQuitMessage把消息WM_QUIT发送到应用程序队列。当GetMessage函数检索到WM_QUIT消息,它就返回NULL,并退出消息外循环。通常,当主窗口正在删除时(即窗口已接收到一条WM_DESTROY消息),应用程序主窗口的窗口函数就发送一条WM_QUIT消息。 j|9;") 1 虽然WinMain指定了返回值的数据类型,但Windows并不使用返回值。不过,在调试一应用程序时,返回值地有用的。通常,可使用与标准C程序相同的返回值约定:0表示成功,非0表示出错。PostQuitMessage函数允许窗口函数指定返回值,这个值复制到WM_QUIT消息的wParam参数中。为了的结束消息循环之后返回这个值,我们的第二只小板凳中使用了以下语句: }-k<>~FA e~c;wP ~cO return msg.wParam ; //表示从PostQuitMessage返回的值 K1)X P w< <>XIL ); 57*z0< Q4Zuz)r* 这个函数我们的第二只小板凳里被我们称为WndProc. [-_3Zr Urj8v2k 下面讲解: ~ P"@^cq $~!%Px) 不知你注意到了没有,这个函数的参数与刚刚提到的GetMessage调用把返回的MSG结构的前四个成员相同。如果消息处理成功,WindowProc的返回值为0. x^Q:U‑1 @X+ m,u Windows的启动应用程序时,先调用WinMain函数,然后调用窗口过程,注意:在我们的这个程序中,只有一个窗口过程,实际上,也许有不止一个的窗口过程。例如,每一个不同的窗口类都 有一个与之相对应的窗口过程。无论Windows何时想传递一个消息到一窗口,都将调用相应的窗口过程。当Windows从环境,或从另一个应用程序,或从用户的应用程序中得到消息时,它将调用窗口过程并将信息传给此函数。总之,窗口过程函数处理所有传送到由此窗口类创建的窗口所得到的消息。并且窗口过程有义务处理Windows扔给它的任何消息。我们在学习Windows程序设计的时候,最主要的就是学习这些消息是什么以及是什么意思,它们是怎么工作的。 z0+LD U(P^-JE~eb/ //这里是此消息的处理过程 u,V_j|(e beaSvhPU‑ ruturn 0; P_4E<"eK :8K}e]!c1 default: ^T:L6: U9ZuD40\ //其他消息由这个默认处理函数来处理 ol‑lsB3]] Xp] jF^5 return DefWindowProc(hwnd,uMsgId,wParam,lParam); Kt](| 9: .m]QN } 5 w(nttYH hxzA1s%~ 在处理完消息后,要返回0,这很重要-----它会告诉Windows不必再重试了。对于那些在程序中不准备处理的消息,窗口过程会把它们都扔给DefWindowProc进行缺省处理,而且还要返回那个函数的返回值。在消息传递层次中,可以认为DefWindowProc函数是最顶层的函数。这个函数发出WM_SYSCOMMAND消息,由系统执行Windows环境中多数窗口所公用的各种通用操作,例如,画窗口的非用户区,更新窗口的正文标题等等等等。 (H5#r2h%Y k 3H0$1 再提示一下,以WM_的消息在Windows头文件中都被定义成了常量,如WM_QUIT=XXXXXXXXXXX,但我们没有必要记住这个数值,也不可能记得住,我们只要知道WM_QUIT就OK了。 ,f{w@Er LPBa!fq 在第二只小板凳中我们只让窗口过程处理了两个消息:一个是WM_PAINT,另一个是WM_DESTROY,先说说第一个消息---WM_PAINT. &8w# 4*W 67hfve 关于WM_PAINT: >{QO$F# tu Y+n 2 无论何时Windows要求重画当前窗口时,都会发该消息。也可以这样说:无论何时窗口非法,都必须进行重画。 哎呀,什么又是"非法窗口"?什么又是重画啊?你这人有没有完,嗯? rrr_{d/ T\n6^@.> 稍安勿燥,我比你还烦呢?我午饭到现在还没吃呢!你有点耐心,来点专业精神好不好???我开始在MSDN里面找有关这个方面的内容了,别急,我找找看: I ^m O >pv/Ns Platform SDK-->Graphics and Multimedia Services-->Windows GDI-->Painting and Drawing-->Using the WM_PAINT Message-----终于找到了。 SOq:!Qt (5 @H 下面是一大套理论: R2n 2mQ< u1 L^INo/ 让我们把Windows的屏幕想像成一个桌面,把一个窗口想像成一张纸。当我们把一张纸放到桌面上时,它会盖住其他的纸,这样被盖住的其他纸上的内容都看不到了。但我们只要把这张纸移开,被盖住的其他纸上的内容就会显示出来了---这是一个很简单的道理,谁都明白。 g hWWJ x9 BaW4 s4u 对于我们的屏幕来说,当一个窗口被另一窗口盖住时,被盖住的窗口的某些部分就看不到了,我们要想看到被盖住的窗口的全部面貌,就要把另一个窗口移开,但是当我们移开后,事情却起了变化-----很可能这个被盖住的窗口上的信息被擦除了或是丢失了。当窗口中的数据丢失或过期时,窗口就变成非法的了---或者称为"无效"。于是我们的任务就来了,我们必须考虑怎样在窗口的信息丢失时"重画窗口"--使窗口恢复成以前的那个样子。这也就是我们在这第二只小板凳中调用UpdateWindow的原因。 i4,p\rE0 *9"x0bth 你忘记了吗?刚才我们在(三)显示和更新窗口中有下面的一些文字: vo`& jZzTnmm&? WinMain()调用完ShowWindow后,还需要调用函数UpdateWindow,最终把窗口显示了出来。调用函数UpdateWindow将产生一个WM_PAINT消息,这个消息将使窗口重画,即使窗口得到更新.---这是程序第一次调用了这条消息。 .Zcz ya L)bMO8JH~m 为重新显示非法区域,Windows就发送WM_PAINT消息实现。要求Windows发送WM_PAINT的情况有改变窗口大小,对话框关闭,使用了UpdateWindows和ScrollWindow函数等。这里注意,Windows并非是消息WM_PAINT的唯一来源,使用InvalidateRect或InvalidateRgn函数也可以产生绘图窗口的WM_PAINT消息...... \jtA8o%n <'~m1l#2 通常情况下用BeginPaint()来响应WM_PAINT消息。如果要在没有WM_PAINT的情况下重画窗口,必须使用GetDC函数得到显示缓冲区的句柄。这里面不再扩展。详细见MDSN。 \4q|Qno8 _ \6v@ 这个BeginPaint函数会执行准备绘画所需的所有步骤,包括返回你用于输入的句柄。结束则是以EndPaint(); Lj3o-@\*j :J`@@H 在调用完BeginPaint之后,WndProc接着调用GetClientRect: (QiA5!wg #y83tNev GetClientRect(hwnd,&rect); cRVL1ne Cf=H~&`Z 第一个参数是程序窗口的句柄。第二个参数是一个指针,指向一个RECT类型的结构。查MSDN,可看到这个结构有四个成员。 [yXmnrxA 'RMUjJ-! WndProc做了一件事,他把这个RECT结构的指针传送给了DrawText的第四个参数。函数DrawText的目的就是在窗口上显示一行字----"你好,欢迎你来到VC之路!",有关这个函数的具体用法这里也没必要说了吧。 2h ‑ R ZY=c 关于WM_DESTROY N `|A VI2lw E3 这个消息要比WM_PAINT消息容易处理得多:只要用户关闭窗口,就会发送WM_DESTROY消息(在窗口从屏幕上移去后)。 U>E: Ub0r JN0h3nZ_ 程序通过调用PostQuitMessage以标准方式响a应WM_DESTROY消息: %":3xj'EEI H‑b=#` PostQuitMessage (0) ; H#TkIFo] @t9HRL?T~ 这个函数在程序的消息队列中插入一个WM_QUIT消息。在(四)创建消息循环中我们曾有这么一段话: Rd#R}yA -tg|y 消息循环以GetMessage调用开始,它从消息队列中取出一个消息: ic2 D$`M o1.~g'!^ ....... *)Rm X$v3 Y Zj-%5 在接收到除WM_QUIT之外的任何一个消息后,GetMessage()都返回TRUE。如果GetMessage收到一个WM_QUIT消息,则返回FALSE,如收到其他消息,则返回TRUE。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。只有当收到的消息是WM_QUIT时,GetMessage才返回FALSE,结束消息循环,从而终止应用程序。 g*V.u]U!i ")Fd'&58‑ 至此,第二支小板凳终于支解完毕!! #J[g r_ .zO^"mXjS 实在是太经典了! WGUA.NET 外挂驿站 B7 %,D} hfwJZ\_60 u[GZ 初始化窗口,注册窗口,创建窗口,显示窗口,销毁窗口 R]"Zv'M(AM 8+'}` n8,% VC/MFC > 基础类 谁能告诉我怎么使程序改变光标形状时不闪烁? 楼主ahuan1978(欢)2001-11-22 10:04:24 在 VC/MFC / 基础类 提问 我在onmousemove里面设置光标,但鼠标移动时,系统老把光标恢复成IDC_CURSOR,我知道只要在注册视图类窗口时使类的默认光标为null就可以了,但我不知道怎么改。谁能告诉我,一定给分。 问题点数:0、回复次数:12Top 1 楼MSVCer(家宝)回复于 2001-11-22 10:15:54 得分 0 在WM_SETCURSOR中设置,不要在move中设置Top 2 楼ahuan1978(欢)回复于 2001-11-22 10:50:42 得分 0 我看到有些书也是这么写的,但我这么做连IDC_CROSSCURSOR都看不到,也就是说也没有闪烁,光标不变,我想这大概是因为系统在检测到Lbuttondown,mousemove,lbuttonup时都会将光标设置成默认光标,也就是在注册窗口类时采用的光标。我请教了高手,问题已经解决,但不是最佳方法,谁能告诉我一个好一点的办法哪?先谢了。Top 3 楼zxiaoer(小二)回复于 2001-11-22 12:25:46 得分 0 就是应该自己处理WM_SETCURSOR消息,然后返回,不要调用基类的处理。Top 4 楼zxiaoer(小二)回复于 2001-11-22 12:26:21 得分 0 就是应该自己处理WM_SETCURSOR消息,然后返回,不要调用基类的处理。Top 5 楼xiaoxiaohan(萧晓寒)回复于 2002-04-27 08:26:21 得分 0 在作界面的时候经常碰到一些比较复杂的作图情况,由于作图过于复杂和频繁,所以时常出现闪烁的情况,几经磨练,虫虫找到一些防止闪烁的方法,写下来和大家共享。 1、将Invalidate()替换为InvalidateRect()。 Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些。虫虫以前很懒,经常为一小块区域的重画就调用Invalidate(),不愿意自己去计算需要重画的Rect,但是事实是,如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。 2、禁止系统搽除你的窗口。 系统在需要重画窗口的时候会帮你用指定的背景色来搽除窗口。可是,也许需要重画的区域也许非常小。或者,在你重画这些东西之间还要经过大量的计算才能开始。这个时候你可以禁止系统搽掉原来的图象。直到你已经计算好了所有的数据,自己把那些需要搽掉的部分用背景色覆盖掉(如:dc.FillRect(rect,&brush);rect是需要搽除的区域,brush是带背景色的刷子),再画上新的图形。要禁止系统搽除你的窗口,可以重载OnEraseBkgnd()函数,让其直接返回TRUE就可以了。如 BOOL CMyWin::OnEraseBkgnd(CDC* pDC) { return TRUE; //return CWnd::OnEraseBkgnd(pDC);//把系统原来的这条语句注释掉。 } 3、有效的进行搽除。 搽除背景的时候,不要该搽不该搽的地方都搽。比如,你在一个窗口上放了一个很大的Edit框,几乎占了整个窗口,那么你频繁的搽除整个窗口背景将导致Edit不停重画形成剧烈的闪烁。事实上你可以CRgn创建一个需要搽除的区域,只搽除这一部分。如 GetClientRect(rectClient); rgn1.CreateRectRgnIndirect(rectClient); rgn2.CreateRectRgnIndirect(m_rectEdit); if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)//处理后的rgn1只包括了Edit框之外的客户区域,这样,Edit将不会被我的背景覆盖而导致重画。 { ASSERT(FALSE); return ; } brush.CreateSolidBrush(m_clrBackgnd); pDC->FillRgn(&rgn1,&brush); brush.DeleteObject(); 注意:在使用这个方法的时候要同时使用方法二。别忘了,到时候又说虫虫的办法不灵。 4、使用MemoryDC先在内存里把图画好,再复制到屏幕上。 这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东东从左画到右的情况。 void CMyWin::OnPaint() { CPaintDC dc1(this); // device context for painting dcMemory.CreateCompatibleDC(&dc1); CBitmap bmp;//这里的Bitmap是必须的,否则当心弄出一个大黑块哦。 bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height()); dcMemory.SelectObject(&bmp); //接下来你想怎么画就怎么画吧。 //dcMemory.FillRect(rectClient,&brush); dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY); dcMemory.DeleteDC(); // Do not call CWnd::OnPaint() for painting messages } Top 6 楼laserman(天使来自火星)回复于 2002-04-27 12:24:33 得分 0 你的问题和我一样,不过我的已经由"jishiping(JSP 季世平) "解决了 你可以看看他在我上面发的帖子(以下是转的): //我不是用VC的,只能给伪代码 bool xxx::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { if (pWnd的句柄==窗口句柄 && hitTest==HTCLIENT) { if (鼠标在指定区域) ::SetCursor(LoadCursor(NULL,IDC_CROSS)); else ::SetCursor(其它的鼠标形状); return true; } return (bool)DefaultProcessing(); } Top 7 楼winne_ll(feiyang)回复于 2002-04-27 12:45:39 得分 0 你可以这样做 BOOL CXXXView::PreCreateWindow(CREATESTRUCT& cs) { cs.lpszClass = AfxRegisterWndClass(NULL, AfxGetApp()->LoadCursor(IDC_CURSOR1),//这里加入你的光标图形 ::CreateSolidBrush(RGB(0,100,255))); return CView::PreCreateWindow(cs); } Top 8 楼_liang_(liang)回复于 2002-04-27 13:01:19 得分 0 是这样的 向windows窗口注册一个新的窗口类 在视图类的PreCreateWindow(CREATESTRUCT &s)中完成 PreCreateWindow(CREATESTRUCT &s) { cs.lpszClass = AfxRegisterWndClass( CS_HREDRAW|CS_VREDRAW, 0, //使窗口不显示默认的箭头光标 (HBRUSH)::GetstockObject(WHITE_BRUSH), 0); return CView::PreCreateWindow(cs); } Top 9 楼Pany(伟)回复于 2002-04-27 16:08:07 得分 0 关注。Top 10 楼s6283(瞎忙)回复于 2002-04-27 16:56:53 得分 0 msdn有篇文章可以看看 HOWTO: Change the Mouse Pointer for a Window in MFC Top 11 楼yu_wlof(yukun)回复于 2002-05-29 16:27:30 得分 0 DWORD SetClassLong( HWND hWnd, // handle to window int nIndex, // index of value to change LONG dwNewLong // new value ); Top 12 楼yu_wlof(yukun)回复于 2002-05-29 16:29:22 得分 0 DWORD SetClassLong( HWND hWnd, // handle to window int nIndex, // index of value to change ,here is GCL_HCURSOR LONG dwNewLong // new value ,give it your hCursor ); Top 相关问题 光标形状 如何让自己程序中的EDIT控件的光标不闪烁! 一个使鼠标指针和闪烁光标“合二为一”,“如影随形”的程序 关于光标指定闪烁位置。 DirectDraw中, 中光标闪烁的问题? 我要疯了,救救我吧,一个实现文本编辑窗口程序中改变光标形状的函数 winGorm程序如何修改光标 Console程序怎么控制光标? windows 程序闪烁问题 如何改变默认的光标形状? 关键词 区域 系统 鼠标 idc dc 重画 光标 rgn rectclient 闪烁 得分解答快速导航 帖主:ahuan1978 相关链接 Visual C++类图书 Visual C++类源码下载 广告也精彩 反馈 请通过下述方式给我们反馈 x 公司简介|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号 世纪乐知(北京)网络技术有限公司 提供技术支持 Copyright © 1999-2010, CSDN.NET, All Rights Reserved