|
在视图类中添加私有bool类型的m_bDraw,m_bDraw在视图类构造函数中初始化为FALSE.在OnLButtonDown和OnLButtonUp消息函数中分别设置为TRUE和FALSE。 在视图类添加私有CPoint类型m_ptOld,在OnLButtonDown消息函数中初始化这个变量m_ptOld=point; void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{ // TODO: Add your message handler code here and/or call default //扇形 CClientDC dc(this); //SetROP2设置绘图模式函数 //dc.SetROP2(R2_BLACK); //dc.SetROP2(R2_MERGENOTPEN); CPen pen(PS_SOLID,1,#ff0000); CPen *pOldpen=dc.SelectObject(&pen); if(TRUE==m_bDraw) { dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.LineTo(m_ptOld); m_ptOld=point; } dc.SelectObject(pOldpen); //连续线条 /* CClientDC dc(this); CPen pen(PS_SOLID,3,#ff0000); CPen *pOldPen=dc.SelectObject(&pen); if(TRUE==m_bDraw) { dc.MoveTo(m_ptOrigin); dc.LineTo(point); m_ptOrigin=point; } dc.SelectObject(pOldPen); */ CView::OnMouseMove(nFlags, point); }
普通画刷 void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { CBrush brushRed(RGB (255,0,0)); CBrush brushGreen(RGB (0,255,0)); CBrush brushBlue(RGB (0,0,255)); CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brushGreen);
CView::OnLButtonUp(nFlags, point); }位图画刷
void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { //创建位图对象 CBitmap bitmap; //加载位图资源 bitmap.LoadBitmap(IDB_BITMAP1); //创建位图画刷 CBrush brush(&bitmap); //创建并获得设备描述表 CClientDC dc(this); //利用位图画刷填充鼠标拖拽过程中形成的矩形区域 dc.FillRect(CRect(m_ptOrigin,point),&brush); CView::OnLButtonUp(nFlags, point); } 透明画刷 void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { //创建并获得设备描述表 CClientDC dc(this); //创建一个空画刷;getstockobject的返回类型是HGDIOBJECT,需要进行强制类型转换 //GetStockObject函数可以获取一个画刷句柄,FromHandle函数可以将画刷句柄转换为画刷对象,绘图操作需要的是一个画刷对象 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //将空画刷填入设备描述表ccwf CBrush *pOldBrush=dc.SelectObject(pBrush); //绘制一个矩形 dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldBrush); CView::OnLButtonUp(nFlags, point); }
void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{ //CClientDC派生于CDC类,构造时自动调用GetDC函数。一旦定义了CClientDC的一个对象就不用再调用GetDC和ReleaseDC //CClientDC dc(this); //pen里面第一个参数:线的类型,第二个参数:线的宽度;第三个参数:线的颜色(红,绿,蓝) CPen pen(PS_DASH,1,RGB (255,0,0)); CClientDC dc(this); CPen* pOldPen=dc.SelectObject(&pen); dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.SelectObject(pOldPen); CView::OnLButtonUp(nFlags, point); }
一、要修改窗口的背景,步骤如下: 1、导入一个位图文件。
2、创建一个View窗体的删除背景时的相应函数 BOOL CWndMapView::OnEraseBkgnd(CDC* pDC) 或者在view类的OnDraw响应函数 void CWndMapView::OnDraw(CDC* pDC) 这两个函数的区别是,一个在擦除时直接将图片贴上;一个是先擦除, 然后在OnDraw时再将图片贴上。所以,后一个会看到闪烁,前一个则无。
3、创建一个位图对象,和刚导入的位图相关联。 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1);
4、创建兼容DC CDC dcCompatibale; dcCompatibale.CreateCompatibleDC(pDC);
5、将位图选择到兼容DC中 dcCompatibale.SelectObject(&bitmap);
6、将兼容DC中的内容拷贝到当前DC中 pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatibale,0,0,SRCCOPY); 代码如下: BOOL CWndMapView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default
CBitmap bitmap; //产生一个位图变量 bitmap.LoadBitmap(IDB_BITMAP1); //让它和导入的位图ID相关联
CDC dcCompatibale; //产生一个兼容的设备容器变量 dcCompatibale.CreateCompatibleDC(pDC); /*创建一个和OnEraseBkgnd函数 所传递的参数pDC,兼容的设备容器*/
dcCompatibale.SelectObject(&bitmap); //将位图变量放入兼容设备中
CRect rect; //产生一个矩形变量rect GetClientRect(&rect); //获得客户端的矩形区域,并付值给rect pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatibale,0,0,SRCCOPY); /*使用传参的指针所指的设备驱动成员函数,将兼容的设备驱动复制过来*/
//如果希望显示的位图能自动拉伸或收缩,以适应窗体的大小,将上面这句话改为。 /* BITMAP map; bitmap.GetBitmap(&map); //先获取图片的大小付给map变量 pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatibale, 0,0,map.bmWidth,map.bmHeight,SRCCOPY);*/ //然后用可拉伸的函数进行复制
return TRUE; /*注意,这里使用系统默认的回调函数, 会将我们所绘的内容擦除。所以必须自己返回一个BOOL值。 但如果是在view类的OnDraw响应函数,就没有返回了。*/ //return CView::OnEraseBkgnd(pDC); }
建立工程文件 选择单文档其他全部默认 添加LButtonDown和LButtonUp的消息响应函数 点击上边的 查看(v)->建立类向导 这里已经点击过Add Funtion ,点击后工程自动添加消息函数。点击edit code可以进行代码编辑。 void CTestView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_ptOrigin=point; //MessageBox("view Clicked!"); CView::OnLButtonDown(nFlags, point); } 同理OnLButtonUp消息函数也一样添加,代码为下边: void CTestView::OnLButtonUp(UINT nFlags, CPoint point) { //1 /* // TODO: Add your message handler code here and/or call default //首先获取窗口的设备描述表 HDC hdc; //m_hWnd是CWnd的一个成员变量用来保存窗口句柄,而CTestView派生于CWnd类。GetDC全局函数获取得当前窗口的设备描述表 hdc = ::GetDC(m_hWnd); //移动到线条的起点 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //画线 LineTo(hdc,point.x,point.y); //释放设备描述表 ::ReleaseDC(m_hWnd,hdc); */ //CWnd类提供了成员函数GetDC和ReleaseDC,先利用Platform SDK函数实现画线功能时,这两个函数前面都加::表示全局 //函数 //2 /* //MFC封装了CDC类(一个设备描述表) CDC* pDC=GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); */ //3 /* //CClientDC派生于CDC类,构造时自动调用GetDC函数。一旦定义了CClientDC的一个对象就不用再调用GetDC和ReleaseDC //CClientDC dc(this); CClientDC dc(GetParent()); dc.MoveTo(m_ptOrigin); dc.LineTo(point); */ //4 //CwindowDC的优势:对象可以访问整个窗口区域 //CWindowDC dc(this); CWindowDC dc(GetParent()); dc.MoveTo(m_ptOrigin); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); }
SHCreateDirectoryEx是window flatform下建立文件夹的函数,他的功能比CreateDirectory(Ex)大。如果创建文件夹目录有的中间目录不存在,SHCreateDirectoryEx可以建立,而CreateDirectory(Ex)则做不到这一点。
int SHCreateDirectoryEx( HWND hwnd, LPCTSTR pszPath, SECURITY_ATTRIBUTES *psa ); hwnd是窗口句柄,可以为NULL. psa是安全属性设置项,可以为NULL. pszPath要注意,这个路径必须是绝对路径. 比如c:\test, d:\hello, 不能写成test,也不能写成.\test这样的相对路径。
设置文件或目录的属性,函数原型如下: BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes); 参数: lpFileName:输入参数,为需要设置文件属性的文件或目录。 返回值: 返回BOOL值,表示是否成功。 使用说明: 文件系统中对文件属性的表示使用了DWORD类型的数据,多个文件属性用“|”运算连在一起 DWORD GetFileAttributes( LPCTSTR lpFilename); 参数: hFileName: 输入参数,为需要获取属性的文件或目录 返回值: 返回DWORD值,表示文件属性。如果返回INVALID_FILE_ATTRIBUTES,则表示失败,可使用GetLastError函数获取错误信息 使用说明: 要判断文件属性,需要使用“&”与属性常量进行运算,如果运行结果为真,则表示具有这种属性 DWORD GetFileAttributes( LPCTSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInfomation); 参数: lpFileName: 输出参数,为需要获取属性的文件或目录 fInfoLevelId:输入参数,是获取文件属性的类别,会影响到lpFileInfomation参数具体采用什么形式输出结果。但是本参数一般只能指定为GetFileExInfoStandard lpFileInfomation: 输出参数,用于返回结果。如果fInfoLevelId参数为GetFileInfoStandard,则为LPWIN32_FILE_ATTRIBUTE_DATA类型。 返回值: 返回BOOL值,表示十分成功
这个错误首先要在当前文档头文件添加#include "stdio.h" 尝试编译如果不行注意添加的stdio.h要在原来的XXXX.h的下面。 如果使用的是vs2008要把工程的属性从Unicode改成多字符集。
原理: (1)在NM_CUSTOMDRAW消息处理函数中根据 dwDrawStage 状态来编写不同的处理代码 (2)主要是判断 CDDS_ITEMPREPAINT 状态 (3)不要在对话框资源管理器中设置CListCtrl控件的Owner draw fixed属性,否则在Debug模式下报错。 方法一,使用NM_CUSTOMDRAW消息映射 (1)声明消息处理函数:afx_msg void OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult ); (1)手动添加消息映射:ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDrawList ) (2)编写自绘消息处理函数 void CListCtrl2::OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult ) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); *pResult = CDRF_DODEFAULT; int rowIndex = static_cast<int>(pLVCD->nmcd.dwItemSpec); if(pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT) { *pResult = CDRF_NOTIFYITEMDRAW; } else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { *pResult = CDRF_NOTIFYSUBITEMDRAW; }//画项 else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) { int nitem = static_cast<int> (pLVCD->nmcd.dwItemSpec); int nsubitem = pLVCD->iSubItem; CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CString str; CRect rect; CSize msize; UINT nFormat = DT_VCENTER | DT_SINGLELINE; rect.left += 3; //调整自绘输出位置 //get rect of the sub item which is going to paint GetSubItemRect(nitem,nsubitem,LVIR_BOUNDS,rect); //get the context is going to paint on the subitem str = GetItemText(nitem,nsubitem);
//如果选中 if(LVIS_SELECTED == this->GetItemState(rowIndex,LVIS_SELECTED)) //判断当前项是否选中 { //所画项是选中项 pDC->SetTextColor(#d93c28);//字体颜色,因该是白色 pDC->FillSolidRect(&rect,#567de4);//背景,深蓝色吧,试试 } else { pDC->SetTextColor(#000000);//字体颜色,因该是白色 pDC->FillSolidRect(&rect,#ffffff);//背景,深蓝色吧,试试 } msize = pDC->GetTextExtent(str); pDC->DrawText(str, &rect, nFormat); //自绘输出 *pResult = CDRF_SKIPDEFAULT; } }
ShellExecute( hWnd: HWND; {指定父窗口句柄} Operation: PChar; {指定动作, 譬如: open、print} FileName: PChar; {指定要打开的文件或程序} Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil} Directory: PChar; {缺省目录} ShowCmd: Integer {打开选项} ): HINST; {执行成功会返回应用程序句柄; 如果这个值 <= 32, 表示执行错误} //返回值可能的错误有: = 0 {内存不足} ERROR_FILE_NOT_FOUND = 2; {文件名错误} ERROR_PATH_NOT_FOUND = 3; {路径名错误} ERROR_BAD_FORMAT = 11; {EXE 文件无效} SE_ERR_SHARE = 26; {发生共享错误} SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效} SE_ERR_DDETIMEOUT = 28; {超时} SE_ERR_DDEFAIL = 29; {DDE 事务失败} SE_ERR_DDEBUSY = 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务} SE_ERR_NOASSOC = 31; {没有相关联的应用程序} //ShowCmd 参数可选值: SW_HIDE = 0; {隐藏} SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活} SW_NORMAL = 1; {同 SW_SHOWNORMAL} SW_SHOWMINIMIZED = 2; {最小化, 激活} SW_SHOWMAXIMIZED = 3; {最大化, 激活} SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED} SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活} SW_SHOW = 5; {同 SW_SHOWNORMAL} SW_MINIMIZE = 6; {最小化, 不激活} SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE} SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE} SW_RESTORE = 9; {同 SW_SHOWNORMAL} SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL} SW_MAX = 10; {同 SW_SHOWNORMAL} //举例说明更多问题 (别忘了 uses ShellAPI;): {譬如用记事本打开一个文件} begin ShellExecute(Handle, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end; {第一个参数是用来当作错误提示窗口的父窗口的, 不能是 nil, 可以是 0(也就是桌面窗口)} begin ShellExecute(0, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end; {第二个参数如果是 nil, 也会默认位 open} begin ShellExecute(0, nil, 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end; {文件路径可以放在参数五} begin ShellExecute(0, nil, 'notepad.exe', 'SchedLgU.Txt', 'C:\WINDOWS', SW_SHOWNORMAL); end; {把参数三直接指定为要打开的文件, 文件将用对应默认程序打开; 次数参数四应为 nil} begin ShellExecute(0, nil, 'SchedLgU.Txt', nil, 'C:\WINDOWS', SW_SHOWNORMAL); end; {如果文件在: 程序目录/当前目录/System32/Windows/PATH环境变量中, 参数五也可以 nil} begin ShellExecute(0, nil, 'SchedLgU.Txt', nil, nil, SW_SHOWNORMAL); end; {如果参数三是个文件, 可以用参数二命令打印} begin ShellExecute(0, 'print', 'SchedLgU.Txt', nil, nil, 1); end; {用 IE 打开网页} begin ShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL); end; {用火狐打开网页} begin ShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL); end; {用默认浏览器打开网页} begin ShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL); end; {还是用默认浏览器打开网页} begin ShellExecute(0, nil, 'http://del.cnblogs.com', nil, nil, 1); end;
|