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