posts - 131, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理


在视图类中添加私有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);
}

posted @ 2012-09-29 16:23 盛胜 阅读(637) | 评论 (0)编辑 收藏

普通画刷
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);
}

posted @ 2012-09-29 14:15 盛胜 阅读(902) | 评论 (0)编辑 收藏


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);
}

posted @ 2012-09-29 10:06 盛胜 阅读(274) | 评论 (0)编辑 收藏

一、要修改窗口的背景,步骤如下:
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);
}

posted @ 2012-09-29 09:16 盛胜 阅读(513) | 评论 (0)编辑 收藏

建立工程文件
选择单文档其他全部默认


添加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);
}

posted @ 2012-09-28 16:08 盛胜 阅读(334) | 评论 (0)编辑 收藏

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这样的相对路径。 

posted @ 2012-09-28 08:52 盛胜 阅读(950) | 评论 (0)编辑 收藏

SetFileAttributes和GetFileAttributes

设置文件或目录的属性,函数原型如下:

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值,表示十分成功

posted @ 2012-09-28 08:46 盛胜 阅读(603) | 评论 (0)编辑 收藏

这个错误首先要在当前文档头文件添加#include "stdio.h"
尝试编译如果不行注意添加的stdio.h要在原来的XXXX.h的下面。
如果使用的是vs2008要把工程的属性从Unicode改成多字符集。

posted @ 2012-09-27 16:09 盛胜 阅读(558) | 评论 (0)编辑 收藏

原理:
(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;
     }
}

posted @ 2012-09-27 14:49 盛胜 阅读(973) | 评论 (0)编辑 收藏

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;

posted @ 2012-09-27 10:57 盛胜 阅读(287) | 评论 (0)编辑 收藏

仅列出标题
共14页: First 6 7 8 9 10 11 12 13 14