MFC使用笔记

来源:互联网 发布:db2分页查询sql详解 编辑:程序博客网 时间:2024/06/08 08:16

1 弹窗显示

AfxMessageBox(L"显示字符");

2 输出字符串(ChildView)

CDC *cDC = this->GetDC();//获得当前窗口的DCCDC mcdc;mcdc.CreateCompatibleDC(NULL);CString str;str.Format(_T("字符串%d"),a);//格式与printf相似mcdc.SetTextColor(RGB(255, 255, 255));//设置字体颜色mcdc.SetBkMode(TRANSPARENT);//背景透明mcdc.SetBkColor(RGB(0, 0, 0));//设置字体背景颜色mcdc.TextOut(0, 0, str);//输出到缓存cDC->BitBlt(0,0,200,200, &mcdc, 0, 0, SRCCOPY);//输出到窗口

3 绘图(ChildView)

CDC *cDC = this->GetDC();   //获得当前窗口的DC CDC mcdc;mcdc.CreateCompatibleDC(NULL);//创建兼容dcCBitmap m;m.LoadBitmap(IDB_BITMAP1);//导入图片m_bgcDC.SelectObject(&m);//绘制到缓存中cDC->BitBlt(0,0,800,600, &mcdc, 0, 0, SRCCOPY);//绘制到窗口Invalidate(FALSE);//更新画面ReleaseDC(cDC);//释放窗口DC

4 设置图标(MainFrm)

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)        return -1;    // 创建一个视图以占用框架的工作区    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))    {        TRACE0("未能创建视图窗口\n");        return -1;    }    HICON ico1, ico2;    ico1 = AfxGetApp()->LoadIcon(IDI_ICON1);    ico2 = AfxGetApp()->LoadIcon(IDI_ICON2);    SetIcon(ico1, TRUE); //设置大图标    SetIcon(ico2, FALSE); //设置小图标    SetMenu(NULL);//设置菜单栏为空    return 0;}

5 设置窗口大小(MFCApplication1)

BOOL CMFCApplication1App::InitInstance(){    /*……*/    m_pMainWnd->SetWindowPos(NULL, 0, 0, 820, 642, SWP_NOMOVE);    m_pMainWnd->ShowWindow(SW_SHOW);    m_pMainWnd->UpdateWindow();    /*……*/}

6 三缓冲(ChildView)
做动画时发现,透明部分有时会停留在上一帧的部分。下面是根据双缓冲技术进化而来三缓冲技术(原创)

CPaintDC dc(this);CDC *cDC = this->GetDC();//获得当前窗口的DC CDC mdc1,mdc2,*mdc;//mdc1是一级缓存,mdc2是二级缓存,mdc是一级缓存的指针mdc = &mdc1;mdc1.CreateCompatibleDC(NULL);mdc2.CreateCompatibleDC(NULL);CBitmap m1,m2;//mdc1是一级缓存位图,mdc2是二级缓存位图m1.CreateCompatibleBitmap(cDC, 650, 650);m2.CreateCompatibleBitmap(cDC, 650, 650);mdc1.SelectObject(&m1);mdc2.SelectObject(&m2);mdc1.FillSolidRect(0, 0, 650, 650, RGB(0, 0, 0));mdc2.FillSolidRect(0, 0, 650, 650, RGB(0, 0, 0));/*绘制的图画*/mdc->TransparentBlt(0, 0, 650, 650, &mdc2, 0, 0, 650, 650, RGB(255, 255, 255));cDC->BitBlt(0, 0, 650, 650, mdc, 0, 0, SRCCOPY);Invalidate(FALSE);//更新画面ReleaseDC(cDC);//释放窗口DC中加载PNG图片**

(1)需定义下面的函数

static bool LoadImageFromResource(IN CImage* pImage, IN UINT nResID, IN LPCWSTR lpTyp){    if (pImage == NULL)        return false;    pImage->Destroy();    HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);    if (hRsrc == NULL)        return false;    HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);    if (hImgData == NULL)    {        ::FreeResource(hImgData);        return false;    }    LPVOID lpVoid = ::LockResource(hImgData);    LPSTREAM pStream = NULL;    DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);    HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);    LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);    ::memcpy(lpByte, lpVoid, dwSize);    ::GlobalUnlock(hNew);    HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);    if (ht != S_OK)    {        pStream->Release();        GlobalUnlock(hNew);        GlobalFree(hNew);        FreeResource(lpByte);        return 0;    }    else    {        pImage->Load(pStream);        pStream->Release();        GlobalUnlock(hNew);        GlobalFree(hNew);        FreeResource(lpByte);    }    ::FreeResource(hImgData);    return true;}ageFromResource(&m, IDB_PNG1, L"PNG");

(2)使用

CImage m;LoadImageFromResource(&m,IDB_PNG1,L"PNG");

8 PNG透明
(1)需定义下面的函数

void TransparentPNG(CImage *png){    for(int i = 0; i <png->GetWidth(); i++)    {        for(int j = 0; j <png->GetHeight(); j++)        {            unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i , j));            pucColor[0] = pucColor[0] *pucColor[3] / 255;            pucColor[1] = pucColor[1] *pucColor[3] / 255;            pucColor[2] = pucColor[2] *pucColor[3] / 255;        }    }}

(2)使用

CImage m;TransparentPNG(&m);
1 0
原创粉丝点击