如题,我写的代码在下面。现阶段可以实现显示已制定路径的图片,若制定路径的图片不存在则显示文件未找到。接下来希望可以实现从外部拖拉一图片进来显示。可是在WmDropFiles函数中不知道如何定义该阶段的IMAGE的指针pimg。还是不要定义呢?可是我还是觉得是要的吧~~
class WinIMG:public WinGDI{
Image* pimg;
public:
  WinIMG(const char* fname,int x0, int y0, int dx, int dy):WinGDI(fname,x0,y0,dx,dy),pimg(0){ 
    WCHAR fname_w[1024];
    wsprintfW(fname_w,L"%S",fname);
    pimg = new Image(fname_w);
    if(pimg->GetLastStatus()!=Ok){
       delete pimg;
       pimg=0;
    }
    DragAcceptFiles(hWnd,true);//the window is acceptable for file 
  }  ~WinIMG(){
    if(pimg!=0)
      delete pimg;
  }  virtual void PaintGDI(Graphics& graphics) { 
  if(pimg) 
  graphics.DrawImage(pimg, 0, 0);
      else {
  FontFamily  fontFamily(L"Times New Roman");
  Font        font(&fontFamily, 24, FontStyleRegular, UnitPixel);
  PointF      pointF(30.0f, 10.0f);
  SolidBrush  solidBrush(Color(255, 0, 0, 255));
  graphics.DrawString(L"File no found!", -1, &font, pointF, &solidBrush);
    }
  }
   virtual LRESULT WmDropFiles(HWND hWnd, WPARAM wP, LPARAM lP) {
    HDROP hDropInfo=(HDROP)wP;
TCHAR szFileName[MAX_PATH + 1] = {0};    
int nFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);     
for (int i=0; i<nFiles; i++) {  
DragQueryFile(hDropInfo, i, szFileName, MAX_PATH);  

//pimg = new Image(szFileName); ???不正确!!
}  

DragFinish(hDropInfo);  //release the space    return -1;
   }};void Test9(){
WinIMG winTT("..\\KK.jpg",100,100,400,400);
winTT.SetMain();//设为主窗口
WinCls::Dispatch();
}int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hprevInst, LPSTR cmd, int nCmdShow){
Test9();//show these pictures return 0;
}

解决方案 »

  1.   

    还是我,现在我可以实现了拖图片了。把函数改为下面这样。但是不是立刻显示,而是要拉一下窗口才显示新的图片,这是为什么呢??而且怎样可以变窗口的名字呢??
    virtual LRESULT WmDropFiles(HWND hWnd, WPARAM wP, LPARAM lP) {
        HDROP hDropInfo=(HDROP)wP;
    char szFileName[MAX_PATH + 1] = {0};    
    int nFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);     
    for (int i=0; i<nFiles; i++) {  
    DragQueryFile(hDropInfo, i, szFileName, MAX_PATH);  
    if(pimg!=0)
    delete pimg;
    WCHAR fname_w[1024];
    wsprintfW(fname_w,L"%S",szFileName);
    pimg = new Image(fname_w);
    //pimg = new Image(szFileName);
    }  

    DragFinish(hDropInfo);  //release the space    return -1;
       }
      

  2.   

    窗口刷新问题。为什么不用GDI+呢?GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的 继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中 GDI进行了优化,并添加了许多新的功能。     遗憾的是,VC6.0并不能直接使用GDI+,下面介绍一种很方便的在VC6.0中使用GDI+的方法。步骤如下:
    GDI+ for VC6.0 SDK下载地址:
    http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip1.将GDI+.rar将其中的Includes和Lib中的文件拷到vc目录下的Includes和Lib文件夹中;2.在你将要使用GDI+的工程中,完成初始化工作:将以下代码加入StdAfx.h头文件中://加入的头文件
    #include <comdef.h>//初始化一下com口
    #ifndef ULONG_PTR
    #define ULONG_PTR unsigned long*
    #include "GdiPlus.h"
    using namespace Gdiplus;
    #endif
    #pragma comment(lib,"gdiplus.lib")3.在程序初始化部分加入//gdi+用到的两个变量   装载gdi+
        GdiplusStartupInput m_gdiplusStartupInput;
        ULONG_PTR m_pGdiToken;
        GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);4在程序退出部分前加入
        //卸载gdi+
        GdiplusShutdown(m_pGdiToken);5在Project->stting->Link->Object/libary中加入gdiplus.lib这样你的工程就可以使用GDI+了:void CPNGDlg::OnButton1() 
    {
    pDC =GetDC();
    Graphics graphics( pDC->m_hDC);
    Image image(L"walkman.png", FALSE);
    graphics.DrawImage(&image, 10,10);
    }用GDI+如何显示透明背景的PNG文件?楼主ruchimy(泥秋)2005-05-26 17:16:14 在 VC/MFC / 图形处理/算法 提问
    我使用如下代码:   
    ImageAttributes imAtt;
    imAtt.SetColorKey(Color(0,0,0),Color(10,10,10),ColorAdjustTypeDefault);
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    Image imageBlue(TEXT(".\\res\\NumbersBlue.png"));
    graphics.DrawImage (&imageYear,Rect(cx,0,iYearWidth,iYearHeight),0,iYearHeight,iYearWidth,iYearHeight,UnitPixel,&imAtt);
        
    显示的图片虽然是透明的,但边边有黑点.哪位高手能指点一下?直接显示就可以了,   透明是GDI+自己处理的,在VC6.0时边要加入以下三句到stdafx.h里边#define ULONG_PTR ULONG
    #include <gdiplus.h>
    using namespace Gdiplus;
    #pragma comment(lib,"gdiplus.lib")
    不要再使用OleLoadPicture了,那会让你看起来很愚蠢。同样功能的函数,你看看GDI+会有几行:HRESULT ShowPic(const TCHAR* lpstrFile, HDC hDC, int X, int Y, int iWidth, int iHeight)
    {
    _ASSERT(lpstrFile);
    USES_CONVERSION;// Create bitmap object and load image
    auto_ptr<Bitmap> pBmp(new Bitmap(CT2CW(lpstrFile)));
    if(!pBmp.get() || Ok != pBmp->LastStatus())
    return E_FAILED;// Draw bitmap on DC
    Graphic grp(hDC);
    if(Ok != grp.DrawImage(pBmp.get(), X, Y, iWidth, iHeight))
    return E_FAILED;
    return S_OK;
    }在vc6.0中使用GDI+图形函数
    作者:radcat    文章来源:本站原创    点击数:3422    更新时间:2007-3-10 15:42:48原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?BoardID=55&ID=102037进来总看到一些网友提出一些关于图形处理方面的问题.例如怎样使一个字符串透明输出,怎样放大,缩小或旋转一幅图片,或将一幅bmp图片保存为jpg格式,我总是回答使用GDI+图形函数,那么怎样使用呢?下面是我写的一个简易教程,第一次写教程,难免有疏漏还请各位网友指正批评.GDI+图形函数,一个组在.net环境下提供的以取代GDI图形函数的类,将来会逐渐取代GDI图形函数.如果在vc6.0中使用gdi+图形函数,那么请按以下步骤操作:1.下载下面的rar文件将其中的Includes和Lib中的文件拷到vc目录下的Includes和Lib文件夹中.点击下载该文件2新建一个工程(以winsdk框架为例mfc也相同)将以下代码加入StdAfx.h头文件中//加入的头文件
    #include <comdef.h>//初始化一下com口#ifndef ULONG_PTR
    #define ULONG_PTR unsigned long*
    #include "GdiPlus.h"
    using namespace Gdiplus;
    #endif
    //结束3在程序初始化部分加入//gdi+用到的两个变量
        GdiplusStartupInput m_gdiplusStartupInput;
        ULONG_PTR m_pGdiToken;
        //装载gdi+
        GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);4在程序退出部分前加入    //卸载gdi+
                GdiplusShutdown(m_pGdiToken);5在Project->stting->Link->Object/libary中加入gdiplus.lib好了经过上面几步我们就可以在程序中使用GDI+了,先试一下吧!显示一个透明字符串    Graphics mygraphics(hdc);//创建一个Graphics对象
        SolidBrush brush(Color(100,0,0,255));//创建一个笔刷 第一项是透明度 后三项是RGB值
        FontFamily fontFamily(L"Latha");选择一种字体
        Font font(&fontFamily,1,FontStyleRegular,UnitInch);
        PointF pointF(5,5);    mygraphics.DrawString(L"Hello Word!",-1,&font,pointF,&brush);或显示一幅jpg图像Graphics imgraphics(hdc);
    Image image(L"001.jpg");
    imgraphics.DrawImage(&image,0,0);注意要把001.jpg考到工程目录下下面是一个例子有兴趣的可以下载
    http://bbs.bc-cn.net/viewFile.asp?BoardID=55&ID=13660以上是我写的,请望能给大家一些帮助