不用给你源码了,直接推荐Windows自带的画图程序就能完成你说的功能

解决方案 »

  1.   

    是啊,msdn里有好多源码,vckbase也不错,分类整理的
      

  2.   

    MSDN里面有一个系列 scribble 示例程序,也就是《深入浅出MFC》里面用来剖析MFC框架和SDK的程序代码,都可以参考的
      

  3.   

    这个只有一项项做,我发部分代码你参考下,BMP格式的图#include "stdafx.h"
    #include "DIBDisplay.h"#include "DIBDisplayDoc.h"
    #include "DIBDisplayView.h"
    #include "mainfrm.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CDIBDisplayViewIMPLEMENT_DYNCREATE(CDIBDisplayView, CScrollView)BEGIN_MESSAGE_MAP(CDIBDisplayView, CScrollView)
    //{{AFX_MSG_MAP(CDIBDisplayView)
    ON_WM_ERASEBKGND()
    ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
    ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
    ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
    ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
    //}}AFX_MSG_MAP
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CDIBDisplayView construction/destructionCDIBDisplayView::CDIBDisplayView()
    {
    // TODO: add construction code here}CDIBDisplayView::~CDIBDisplayView()
    {
    }BOOL CDIBDisplayView::PreCreateWindow(CREATESTRUCT& cs)
    {
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs return CScrollView::PreCreateWindow(cs);
    }/////////////////////////////////////////////////////////////////////////////
    // CDIBDisplayView drawingvoid CDIBDisplayView::OnDraw(CDC* pDC)
    {
    BeginWaitCursor(); CDIBDisplayDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc); HDIB hDIB = pDoc->GetHDIB();
    if (hDIB != NULL)
    {
    LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
    int cxDIB = (int) pDoc->GetDibImage()->DIBWidth(lpDIB);
    int cyDIB = (int) pDoc->GetDibImage()->DIBHeight(lpDIB); ::GlobalUnlock((HGLOBAL) hDIB);

    CRect rcDIB;
    rcDIB.top = rcDIB.left = 0;
    rcDIB.right = cxDIB;
    rcDIB.bottom = cyDIB;

    CRect rcDest;

    if (pDC->IsPrinting())
    {
    // 是打印,计算输出图像的位置和大小,以便符合页面

    // 获取打印页面的水平宽度(象素)
    int cxPage = pDC->GetDeviceCaps(HORZRES);
    // 获取打印页面的垂直高度(象素)
    int cyPage = pDC->GetDeviceCaps(VERTRES);
    // 获取打印机每英寸象素数
    int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
    int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);

    // 计算打印图像大小(缩放,根据页面宽度调整图像大小)
    rcDest.top = rcDest.left = 0;
    rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
    / ((double)cxDIB * cxInch));
    rcDest.right = cxPage;

    // 计算打印图像位置(垂直居中)
    int temp = cyPage - (rcDest.bottom - rcDest.top);
    rcDest.bottom += temp/2;
    rcDest.top += temp/2;
    }
    else   
    {
    // 不必缩放图像
    rcDest = rcDIB;
    }

    pDoc->GetDibImage()->PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
    &rcDIB, pDoc->GetDocPalette());
    }

    EndWaitCursor();
    }void CDIBDisplayView::OnInitialUpdate()
    {
    CScrollView::OnInitialUpdate(); // TODO: calculate the total size of this view}/////////////////////////////////////////////////////////////////////////////
    // CDIBDisplayView printingBOOL CDIBDisplayView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    // 设置总页数为一。
    pInfo->SetMaxPage(1); return DoPreparePrinting(pInfo);
    }void CDIBDisplayView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add extra initialization before printing
    }void CDIBDisplayView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add cleanup after printing
    }/////////////////////////////////////////////////////////////////////////////
    // CDIBDisplayView diagnostics#ifdef _DEBUG
    void CDIBDisplayView::AssertValid() const
    {
    CScrollView::AssertValid();
    }void CDIBDisplayView::Dump(CDumpContext& dc) const
    {
    CScrollView::Dump(dc);
    }CDIBDisplayDoc* CDIBDisplayView::GetDocument() // non-debug version is inline
    {
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDIBDisplayDoc)));
    return (CDIBDisplayDoc*)m_pDocument;
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CDIBDisplayView message handlersBOOL CDIBDisplayView::OnEraseBkgnd(CDC* pDC) 
    {
    // 主要是为了设置子窗体默认的背景色
    // 背景色由文档成员变量m_refColorBKG指定 CDIBDisplayDoc* pDoc = GetDocument();
    CBrush brush(pDoc->m_refColorBKG);                                              
    CBrush* pOldBrush = pDC->SelectObject(&brush);

    CRect rectClip;
    pDC->GetClipBox(&rectClip); // 获取重绘区域
    pDC->PatBlt(rectClip.left, rectClip.top, rectClip.Width(), 
    rectClip.Height(), PATCOPY); pDC->SelectObject(pOldBrush);                                                   return TRUE;
    }void CDIBDisplayView::OnEditCopy() 
    {
    // 复制当前图像 CDIBDisplayDoc* pDoc = GetDocument();

    if (OpenClipboard())
    {
    BeginWaitCursor();
    EmptyClipboard();

    // 复制当前图像到剪贴板
    SetClipboardData (CF_DIB, pDoc->GetDibImage()->
    CopyHandle((HANDLE) pDoc->GetHDIB()) ); CloseClipboard();
    EndWaitCursor();
    }
    }void CDIBDisplayView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
    {
    // 如果当前DIB对象不空,复制菜单项有效
    pCmdUI->Enable(GetDocument()->GetHDIB() != NULL);
    }void CDIBDisplayView::OnEditPaste() 
    {
    // 粘贴图像

    HDIB hNewDIB = NULL;
    CDIBDisplayDoc* pDoc = GetDocument();

    if (OpenClipboard())
    {
    BeginWaitCursor(); // 读取剪贴板中的图像
    hNewDIB = (HDIB)pDoc->GetDibImage()->CopyHandle(::GetClipboardData(CF_DIB)); CloseClipboard();

    if (hNewDIB != NULL)
    {
    pDoc->ReplaceHDIB(hNewDIB); // 替换DIB,同时释放旧DIB对象
    pDoc->InitDIBData(); // 更新DIB大小和调色板
    pDoc->SetModifiedFlag(TRUE); // 设置脏标记
    SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); // 重新设置滚动视图大小
    OnDoRealize((WPARAM)m_hWnd,0); // 实现新的调色板
    pDoc->UpdateAllViews(NULL); // 更新视图
    } EndWaitCursor();
    }
    }void CDIBDisplayView::OnUpdateEditPaste(CCmdUI* pCmdUI) 
    {
    // 如果当前剪贴板中有DIB对象,粘贴菜单项有效
    pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));
    }LRESULT CDIBDisplayView::OnDoRealize(WPARAM wParam, LPARAM)
    {
    ASSERT(wParam != NULL); CDIBDisplayDoc* pDoc = GetDocument();
    if (pDoc->GetHDIB() == NULL)
    {
    return 0L;
    }

    CPalette* pPal = pDoc->GetDocPalette();
    if (pPal != NULL)
    {
    CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
    ASSERT_KINDOF(CMainFrame, pAppFrame);

    CClientDC appDC(pAppFrame); // All views but one should be a background palette.
    // wParam contains a handle to the active view, so the SelectPalette
    // bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
    CPalette* oldPalette = appDC.SelectPalette(pPal,((HWND)wParam)!=m_hWnd);
    if (oldPalette != NULL)
    {
    UINT nColorsChanged = appDC.RealizePalette();
    if (nColorsChanged > 0)
    {
    pDoc->UpdateAllViews(NULL);
    }
    appDC.SelectPalette(oldPalette, TRUE);
    }
    else
    {
    TRACE0("\tCCh1_1View::OnPaletteChanged中调用SelectPalette()失败!\n");
    }
    }

    return 0L;
    }void CDIBDisplayView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
    {
    CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView); if (bActivate)
    {
    ASSERT(pActivateView == this);
    OnDoRealize((WPARAM)m_hWnd, 0);   // same as SendMessage(WM_DOREALIZE);
    }
    }void CDIBDisplayView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
    {
    CScrollView::OnInitialUpdate();
    ASSERT(GetDocument() != NULL);

    SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
    }
      

  4.   

    提供一个关键词,图形设备接口,GDI,这个掌握了,基本绘图程序就没问题了
      

  5.   

    GDI
    Grapgic Divice Interface