山寨:不是最好的,是最适合我们的!欢迎体验山寨 中文版MSDN

Blog @ Blog

当华美的叶片落尽,生命的脉络才历历可见。 -- 聂鲁达

常用链接

统计

积分与排名

BBS

Blog

Web

最新评论

mfc框架结合sdk的学习笔记(一) [转]

框架可能框住了我们自由思想,当然也可以通过研究框架而得到更多东西。不过,我学习mfc是因为特殊的原因而必须为之,所以讲究的是开发速度了,不过如果 学习windows编程还是要从sdk做起比较好,不过体力活较多罢了。 不过很显然,框架很方便。就从框架入手吧。我入门一般都是从高开始跳楼,这样觉得速度可能会快点,个人的学习方法问题。 呵呵。这仅仅是笔记,给自己看的,高手绕行~
  1. mfc只是框架,它有WinMain函数,它藏在APPMODUL.CPP文件中,函数原型为
    1. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow) 
    2. { 
    3. return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);  
    4. }
  2. 有些函数之所以可以在WinMain之前执行,是因为有全局构造。
  3. 然后它还需要init。
  • mfc在创建单文档程序的时候会自动生成三个类,分别由CDialog,CFrameWnd,CWinApp,CDocument,CView派生出来。
    1. CFrameWnd类中负责菜单栏。
    2. CView中负责用户部分。
    3. 其它略。
  • 关于CView
    1. 在窗口发生重绘的时候会激发OnDraw()函数
    2. 增加成员变量可以直接在类右键Add Variable,比较方便
    3. 增加事件可以直接右键Add Windows Message Handle,详细查看msdn就可以了
  • 一些类与结构和函数..
    1. HDC  : Handle to a device context (DC). >> MFC中有封装了的CDC,使用后需要ReleaseDC()
    2. sdk中获取hdc句柄为GetDC(m_hWnd)
  • 代码段
    1. sdk典型画线
      1. hdc = ::GetDC(m_hWnd);
      2. MoveToEx(hdc,dw_Point.x,dw_Point.y,NULL);
      3. LineTo(hdc,point.x,point.y);
      4. ::ReleaseDC(m_hWnd,hdc);
    2. 封装的CDC画线
      1. CDC *pdc = GetDC();
      2. pdc->MoveTo(dw_Point);
      3. pdc->LineTo(point);
      4. ReleaseDC(pdc);
    3. mfc委托画线,析构函数包含ReleaseDC
      1. CClientDC cdc(this);
      2. cdc.MoveTo(dw_Point);
      3. cdc.LineTo(point);
    4. 这个类似上面,但是比较无敌
      1. CWindowDC cdc(GetDesktopWindow()); //GetDesktopWindow()对于不同的DC可以获取对此画图
      2. cdc.MoveTo(dw_Point);
      3. cdc.LineTo(point);
    5. 这个是有颜色的
      1. CPen pen(PS_DASH,1,RGB(255,0,0)); //创建画笔
      2. CClientDC cdc(this);
      3. CPen *oldpen =
      4. cdc.SelectObject(&pen); //选择这个画笔对象
      5. cdc.MoveTo(dw_Point);
      6. cdc.LineTo(point);
      7. cdc.SelectObject(oldpen);//选回
    6. 从资源获取位图,再用绘图画出的矩形
      1. CBitmap bitmap;
      2. bitmap.LoadBitmap(IDB_BITMAP1);
      3. CBrush cbh(&bitmap);
      4. cdc.FillRect(CRect(dw_Point,point),&cbh);
      5. cdc.Rectangle(CRect(dw_Point,point));
    7. 定位光标
      1. SetCaretPos(point); //point定位光标
    8. 光标函数
      1. CClientDC cdc(this);
      2. TEXTMETRIC tmc; //定义TEXT公制结构体
      3. cdc.GetTextMetrics(&tmc); //导入到结构体        
      4. CreateSolidCaret(tmc.tmAveCharWidth/8,tmc.tmHeight); //生成光标的函数
      5. ShowCaret();
    9. ondraw下
      1. void CMfc_DRAWView::OnDraw(CDC* pDC)//每次重绘时调用.. 已经有dc
      2. { 
      3. CMfc_DRAWDoc* pDoc = GetDocument();
      4. ASSERT_VALID(pDoc);
      5. CString str;//字符串 
      6. str.LoadString(IDS_MYTEXT)//获得字符串在资源
      7. pDC->TextOut(0,200,str); //0,200的地方写入字符 
      8. }
    10. 常规sdk直接api编程基础
      1. #include <windows.h>
      2. #include <stdio.h>
      3. LRESULT CALLBACK Winpro(                 //回调函数
      4.   HWND hwnd,      // handle to window
      5.   UINT uMsg,      // message identifier
      6.   WPARAM wParam// first message parameter
      7.   LPARAM lParam   // second message parameter
      8. )
      9. {
      10.         switch(uMsg) //消息循环
      11.         {
      12.                 case WM_CHAR: //键盘按下事件
      13.                         char szchar[20];
      14.                         sprintf(szchar,"char is %d",wParam); //格式化字符
      15.                         MessageBox(hwnd,szchar,"mrzenix'first", 0); //弹出
      16.                         break;
      17.                 case WM_LBUTTONDOWN: //左键按下事件
      18.                         MessageBox(hwnd,"mouse click!","mrzenix'first",0);
      19.                         HDC hdc;
      20.                         hdc = GetDC(hwnd);
      21.                         TextOut(hdc,0,50,"mrzenix的第一个win程序!!",strlen("mrzenix的第一个win程序!!")); //输出到hdc设备区域
      22.                         ::ReleaseDC(hwnd,hdc);//释放dc
      23.                          break;
      24.                 case WM_PAINT: //重绘
      25.                         HDC hDC;
      26.                         PAINTSTRUCT ps;
      27.                         hDC = BeginPaint(hwnd,&ps); //返回dc
      28.                         TextOut(hDC,0,0,"MRZENIX",strlen("MRZENIX"));
      29.                          break;
      30.                 case WM_CLOSE: //关闭按钮事件
      31.                         if(IDYES==MessageBox(hwnd,"Right?","Exit",MB_YESNO))
      32.                         {
      33.                                 DestroyWindow(hwnd); //发送销毁事件
      34.                         }
      35.                          break;
      36.                 case WM_DESTROY: //销毁事件
      37.                         PostQuitMessage(0); //退出
      38.                         break;
      39.                 default:
      40.                         return DefWindowProc(hwnd,uMsg,wParam,lParam)//默认事件驱动
      41.         }
      42.         return 0;
      43. }
      44.  
      45.  
      46.  
      47. int WINAPI WinMain(
      48.   HINSTANCE hInstance,      // handle to current instance
      49.   HINSTANCE hPrevInstance// handle to previous instance
      50.   LPSTR lpCmdLine,          // command line
      51.   int nCmdShow              // show state
      52. )
      53. {
      54.     WNDCLASS wndcls; //窗口类
      55.     wndcls.cbClsExtra = 0;
      56.     wndcls.cbWndExtra = 0;
      57.     wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      58.     wndcls.hCursor = LoadCursor(NULL,IDC_CROSS);
      59.     wndcls.hIcon = LoadIcon(NULL,IDI_APPLICATION);
      60.     wndcls.hInstance = hInstance;
      61.     wndcls.lpfnWndProc = Winpro;
      62.     wndcls.lpszClassName = "MRZENIX";
      63.     wndcls.lpszMenuName = NULL;
      64.     wndcls.style = CS_HREDRAW|CS_VREDRAW; //样式
      65.     RegisterClass(&wndcls);    //注册窗口
      66.  
      67.     HWND hwnd;
      68.     hwnd= CreateWindow("MRZENIX","MRZENIX",WS_OVERLAPPEDWINDOW,
      69.         0,0,800,600,NULL,NULL,hInstance,NULL); //创建窗口然后返回句柄
      70.     ::ShowWindow(hwnd,SW_SHOWNORMAL); //显示
      71.     ::UpdateWindow(hwnd); //...
      72.  
      73.     MSG msg; //定义消息结构
      74.     while(GetMessage(&msg,NULL,0,0)) //捕获消息
      75.     {
      76.         TranslateMessage(&msg); //翻译消息
      77.         DispatchMessage(&msg)//发出.
      78.     }
      79.     return 0;
      80.  
      81. }

其实,MSDN是无敌的。以上只是典故,故有节外生枝的空间,所以,好好利用才是王道。

posted on 2008-02-20 22:47 isabc 阅读(752) 评论(0)  编辑 收藏 引用 所属分类: C++基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


广告信息(免费广告联系)

中文版MSDN:
欢迎体验