7056|15

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince 创建了一个窗口显示图片,为啥显示不出来 [复制链接]

void DrawImage(HDC hdc,const void *buffer,UINT size,LPCRECT rect)
{
        IImagingFactory *pImageFactory=NULL;
        IImage *pImage=NULL;
        CoInitializeEx(NULL,COINIT_MULTITHREADED);
        if(SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImageFactory)))
        {
                if(SUCCEEDED(pImageFactory->CreateImageFromBuffer(buffer,size,DISPOSAL_NONE,&pImage)))
                {
                        pImage->Draw(hdc,rect,NULL);
                        pImage->Release();
                }
                pImageFactory->Release();
        }
        CoUninitialize();
}

//LoadResourceImage函数主要将图片导入内存,使用这个函数,只要将图片的ID,图片的类名,以及要显示图片的坐标位置输入即可.
void LoaResourceImage(HWND hwnd,LPCWSTR lpName,LPCWSTR lpType,int i,int left,int right,int bottom,int top)
{
        HDC hdc;
        HRSRC hr;
        DWORD dwsize;
        HGLOBAL hg;
        LPSTR lp;
        HMODULE hModule_Current=GetModuleHandle(NULL);
        hr=FindResource(hModule_Current,lpName,lpType);
        dwsize=SizeofResource(GetModuleHandle(NULL),hr);
        hg=LoadResource(GetModuleHandle(NULL),hr);
        lp=(LPSTR)LockResource(hg);
        hdc=GetDC(hwnd);
        RECT rect;
        rect.bottom = bottom;
        rect.top = top;
        rect.right = right;
        rect.left = left;
        DrawImage(hdc,lp,dwsize,&rect);
        DeleteObject(hr);
}


// 此代码模块中包含的函数的前向声明:
ATOM                        MyRegisterClass(HINSTANCE, LPTSTR);
BOOL                        InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK        About(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
        MSG msg;

        WNDCLASS wc;

        wc.style         = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYTEST));
        wc.hCursor       = 0;
        wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName  = 0;
        wc.lpszClassName = szWindowClass;

HWND hWnd = CreateWindow(szWindowClass, NULL, WS_VISIBLE,
        0,0,Screen_width, Screen_height, NULL, NULL, hInstance, NULL);
SetWindowPos(hWnd,HWND_TOPMOST,0,0,Screen_width,Screen_height,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);
LoaResourceImage(hWnd,MAKEINTRESOURCE(IDM_IMAGE),RT_BITMAP,0,0,0,412,475);

    if (!hWnd)
    {
        return FALSE;
    }

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);


        // 主消息循环:
        while (GetMessage(&msg, NULL, 0, 0))
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }

        return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    static int cxChar=0,cyChar=0;
        HBRUSH brush;
        HWND btnhwnd1,btnhwnd2,btnhwnd3;
        static int i=0;
        RECT rect={10,10,30,30};
    switch (message)
    {
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
                case IDM_HELP_ABOUT:
                    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
                    break;
                case IDM_FILE_EXIT:
                    DestroyWindow(hWnd);
                    break;
                                case  IDC_PUSHBTN3:
                                        SendMessage(hWnd,WM_CLOSE,0,0);
                                        memset(HWpotArr,0,MAX_POINTNUM);
                                        break;
                                case  IDC_PUSHBTN2:
                                        InvalidateRect(hWnd,NULL,TRUE);
                                        memset(HWpotArr,0,MAX_POINTNUM);
                                        break;
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
            }

            break;
        case WM_CREATE:                               
LoaResourceImage(hWnd,MAKEINTRESOURCE(IDM_IMAGE),RT_BITMAP,0,0,0,Screen_height,Screen_width);                break;
case WM_DESTROY:
            CommandBar_Destroy(g_hWndCommandBar);
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

程序编译通过 为什么不显示呢
此帖出自WindowsCE论坛

最新回复

结贴了 经过多方改动 终于可以显示了 在wm_create里是显示不出来的,要在wm_paint中 代码贴出: void DrawImage(HWND hwnd,LPCWSTR lpName,LPCWSTR lpType,int left,int top) {         HDC hdc=GetDC(hwnd);         HMODULE hModule_Current=GetModuleHandle(NULL);         HRSRC hr=FindResource(hModule_Current,MAKEINTRESOURCE(IDP_IMAGE),_T("JPG"));         if(hr==NULL)                 return;         DWORD dwsize=SizeofResource(GetModuleHandle(NULL),hr);         HGLOBAL hg=LoadResource(GetModuleHandle(NULL),hr);         LPSTR lp=(LPSTR)LockResource(hg);         RECT rect;         rect.top = top;         rect.left=left;         IImagingFactory *pImageFactory=NULL;         IImage *pImage;         if(SUCCEEDED(CoInitializeEx(NULL,COINIT_MULTITHREADED)))         {                 HRESULT hResult=0;                 if(SUCCEEDED(hResult=CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImageFactory)))                 {                         hResult=0;                         if(SUCCEEDED(pImageFactory->CreateImageFromBuffer(lp,dwsize,DISPOSAL_NONE,&pImage)))                         {                                 ImageInfo imgInf;                                 pImage->GetImageInfo(&imgInf);                                 rect.right=rect.left+imgInf.Width;                                 rect.bottom=397;                                 pImage->Draw(hdc,&rect,NULL);                                 pImage->Release();                         }                         else MessageBox(hwnd,_T("create fail"),_T("error"),MB_OKCANCEL);                         pImageFactory->Release();                 }                 else                         MessageBox(hwnd,_T("CoCreateInstance fail"),_T("error"),MB_OKCANCEL);                 if(hResult==REGDB_E_CLASSNOTREG)                         MessageBox(hwnd,_T("REGDB_E_CLASSNOTREG"),_T("error"),MB_OKCANCEL);                                 CoUninitialize();                 }         DeleteObject(hr); } wm_paint: hdc = BeginPaint(hWnd, &ps);                        // TODO: 在此添加任意绘图 DrawImage(hWnd,MAKEINTRESOURCE(IDP_IMAGE),_T("JPG"),0,0);             EndPaint(hWnd, &ps);             break; 在此谢谢各位了 再问:能否再做出些特效:旋转 或者轮流显示多张图片?  详情 回复 发表于 2010-4-19 15:55
点赞 关注
 

回复
举报

87

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
有可能是你在窗口未显示出来的时候就画图,等窗口显示后将你画的图覆盖了.
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
图片是自己导入的?图片的类型确实是RT_BITMAP?
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 reallyu 的回复:
有可能是你在窗口未显示出来的时候就画图,等窗口显示后将你画的图覆盖了.

是这样, 在WM_PAINT里面画图吧
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 gauntf 的回复:
图片是自己导入的?图片的类型确实是RT_BITMAP?


图片是我自己导入的一个图片 类型应该是位图吧  加资源的时候选的BITMAP
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 trueman_onlyme 的回复:
引用 1 楼 reallyu 的回复:
有可能是你在窗口未显示出来的时候就画图,等窗口显示后将你画的图覆盖了.

是这样, 在WM_PAINT里面画图吧


不行啊 在WM_PAINT里面 也是不显示呢
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
我用evc以前用过,没问题哦。。。不管是picture空间,还是wm_paint都可以。
此帖出自WindowsCE论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 mxm1986 的回复:
我用evc以前用过,没问题哦。。。不管是picture空间,还是wm_paint都可以。


我是在WIN32下  应该不是这个问题呀
奇怪了 咋就不显示呢
此帖出自WindowsCE论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

9
 
自己导入图片的时候,不是要求你自己填写资源类型(resource type)吗,
比如你填写的时候是“mytype”
LoaResourceImage(hWnd,MAKEINTRESOURCE(IDM_IMAGE),_T("mytype"),0,0,0,Screen_height,Screen_width)
试下
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 gauntf 的回复:
自己导入图片的时候,不是要求你自己填写资源类型(resource type)吗,
比如你填写的时候是“mytype”
LoaResourceImage(hWnd,MAKEINTRESOURCE(IDM_IMAGE),_T("mytype"),0,0,0,Screen_height,Screen_width)
试下

我试了 照你说的这样  LoaResourceImage(hWnd,MAKEINTRESOURCE(IDM_IMAGE),_T("mytype"),0,0,0,Screen_height,Screen_width)  不行,还是不显示

我又导入了一个BMP 图片,资源类型是BITMAP  
LoaResourceImage(hWnd,MAKEINTRESOURCE(IDM_IMAGE),RT_BITMAP,0,0,0,Screen_height,Screen_width) 仍然不显示  

这是什么原因呢 郁闷死
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 


  1. // Handler for drawing
  2. void OnDraw(HWND hWnd)
  3. {
  4.         PAINTSTRUCT ps;
  5.         HDC hdc, hdcMem, hdcNew;
  6.         HBITMAP hBmp;
  7.         HBRUSH hBr;
  8.         int dstX, dstY, i, offset;
  9.         RECT rt, rtmp;

  10.         hdc = BeginPaint(hWnd, &ps);
  11.         GetClientRect(hWnd, &rt);

  12.         // First draw the colored bars in the upper part of the window that serve as
  13.         // the starting bitmap to rotate
  14.         offset = (rt.right - rt.left - 200) / 2;
  15.         rtmp.left = offset;
  16.         rtmp.right = offset + 1;
  17.         rtmp.top = 0;
  18.         rtmp.bottom = 200;
  19.         for (i = 0; i < 200; i++) {
  20.                 hBr = CreateSolidBrush(RGB(i * 8 % 255, i * 5 % 255, i * 2 % 255));
  21.                 FillRect(hdc, &rtmp, hBr);
  22.                 DeleteObject(hBr);
  23.                 rtmp.left++;
  24.                 rtmp.right++;
  25.         }

  26.         // BitBlt the starting Bitmap into a memory HDC
  27.         hdcNew = CreateCompatibleDC(hdc);
  28.         hBmp = CreateCompatibleBitmap(hdc, 200,200);
  29.         SelectObject(hdcNew, hBmp);
  30.         BitBlt(hdcNew, 0, 0, 200, 200, hdc, (rt.right - rt.left - 200) / 2, 0, SRCCOPY);

  31.         // Rotate that memory HDC
  32.         RotateMemoryDC(hBmp, hdcNew, 200, 200, g_angle, hdcMem, dstX, dstY);
  33.         DeleteObject(hBmp);
  34.         DeleteDC(hdcNew);

  35.         // Create the output HDC
  36.         hdcNew = CreateCompatibleDC(hdc);
  37.         hBmp = CreateCompatibleBitmap(hdc, 400,400);
  38.         SelectObject(hdcNew, hBmp);
  39.         rtmp.left = rtmp.top = 0;
  40.         rtmp.right = rtmp.bottom = 400;

  41.         // Fill the output HDC with the window background color and BitBlt the rotated bitmap into it
  42.         FillRect(hdcNew, &rtmp, GetSysColorBrush(COLOR_WINDOW));
  43.         BitBlt(hdcNew, (400 - dstX) / 2, (400-dstY) / 2, dstX, dstY, hdcMem, 0, 0, SRCCOPY);
  44.         DeleteDC(hdcMem);
  45.         BitBlt(hdc, (rt.left + rt.right - 400) / 2, rt.bottom - 400, 400, 400, hdcNew, 0, 0, SRCCOPY);
  46.         DeleteObject(hBmp);
  47.         DeleteDC(hdcNew);
  48.         EndPaint(hWnd, &ps);
  49. }

  50. //
  51. //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
  52. //
  53. //  PURPOSE:  Processes messages for the main window.
  54. //
  55. //  WM_COMMAND        - process the application menu
  56. //  WM_PAINT        - Paint the main window
  57. //  WM_DESTROY        - post a quit message and return
  58. //
  59. //
  60. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  61. {
  62.         int wmId, wmEvent;

  63.         switch (message)
  64.         {
  65.                 case WM_TIMER:
  66.                         // Handle the redraw with the timer
  67.                         g_angle = g_angle + .05f;
  68.                         RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
  69.                         break;
  70.                 case WM_COMMAND:
  71.                         wmId    = LOWORD(wParam);
  72.                         wmEvent = HIWORD(wParam);
  73.                         // Parse the menu selections:
  74.                         switch (wmId)
  75.                         {
  76.                                 case IDM_ABOUT:
  77.                                    DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  78.                                    break;
  79.                                 case IDM_EXIT:
  80.                                    DestroyWindow(hWnd);
  81.                                    break;
  82.                                 default:
  83.                                    return DefWindowProc(hWnd, message, wParam, lParam);
  84.                         }
  85.                         break;
  86.                 case WM_PAINT:
  87.                         OnDraw(hWnd);
  88.                         break;
  89.                 case WM_DESTROY:
  90.                         PostQuitMessage(0);
  91.                         break;
  92.                 default:
  93.                         return DefWindowProc(hWnd, message, wParam, lParam);
  94.    }
  95.    return 0;
  96. }


复制代码


此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 trueman_onlyme 的回复:
C/C++ code

// Handler for drawing
void OnDraw(HWND hWnd)

这种位图 是可以显示出来的
为什么图片就显示不出来呢
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
调式了下,if(SUCCEEDED(pImageFactory->CreateImageFromBuffer(buffer,size,DISPOSAL_NONE,&pImage)))
是不成功的
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 gauntf 的回复:
调式了下,if(SUCCEEDED(pImageFactory->CreateImageFromBuffer(buffer,size,DISPOSAL_NONE,&pImage)))
是不成功的

是啊 麻烦问下 是什么错误呢
我没有模拟器 调试不了
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

15
 
我也不清楚了,执行之后pImage没有值,其他都有值,就是函数执行后,结果写不进pImage
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

16
 
结贴了 经过多方改动
终于可以显示了

在wm_create里是显示不出来的,要在wm_paint中

代码贴出:
void DrawImage(HWND hwnd,LPCWSTR lpName,LPCWSTR lpType,int left,int top)
{
        HDC hdc=GetDC(hwnd);
        HMODULE hModule_Current=GetModuleHandle(NULL);
        HRSRC hr=FindResource(hModule_Current,MAKEINTRESOURCE(IDP_IMAGE),_T("JPG"));
        if(hr==NULL)
                return;
        DWORD dwsize=SizeofResource(GetModuleHandle(NULL),hr);
        HGLOBAL hg=LoadResource(GetModuleHandle(NULL),hr);
        LPSTR lp=(LPSTR)LockResource(hg);
        RECT rect;
        rect.top = top;
        rect.left=left;
        IImagingFactory *pImageFactory=NULL;
        IImage *pImage;
        if(SUCCEEDED(CoInitializeEx(NULL,COINIT_MULTITHREADED)))
        {
                HRESULT hResult=0;
                if(SUCCEEDED(hResult=CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImageFactory)))
                {
                        hResult=0;
                        if(SUCCEEDED(pImageFactory->CreateImageFromBuffer(lp,dwsize,DISPOSAL_NONE,&pImage)))
                        {
                                ImageInfo imgInf;
                                pImage->GetImageInfo(&imgInf);
                                rect.right=rect.left+imgInf.Width;
                                rect.bottom=397;
                                pImage->Draw(hdc,&rect,NULL);
                                pImage->Release();
                        }
                        else MessageBox(hwnd,_T("create fail"),_T("error"),MB_OKCANCEL);
                        pImageFactory->Release();
                }
                else
                        MessageBox(hwnd,_T("CoCreateInstance fail"),_T("error"),MB_OKCANCEL);
                if(hResult==REGDB_E_CLASSNOTREG)
                        MessageBox(hwnd,_T("REGDB_E_CLASSNOTREG"),_T("error"),MB_OKCANCEL);
                                CoUninitialize();
                }
        DeleteObject(hr);
}

wm_paint:
hdc = BeginPaint(hWnd, &ps);           
            // TODO: 在此添加任意绘图
DrawImage(hWnd,MAKEINTRESOURCE(IDP_IMAGE),_T("JPG"),0,0);
            EndPaint(hWnd, &ps);
            break;

在此谢谢各位了

再问:能否再做出些特效:旋转 或者轮流显示多张图片?
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表