首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • visual c++如何实现当按下PageDown时显示下一幅图像,按下PageUp时显示上一幅图像 [已结贴,结贴人:guozhuyz]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guozhuyz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-04-26 17:37:09 楼主
    我想用visual c++实现图像的读入,和显示,并且当按下pageDown PageUp时能够分别显示下一幅图像和上一幅图像.


    //////////////////////////////////////
    //readraw.h


    #include <afxwin.h>

    class CMyApp:public CWinApp
    {
    public:
    virtual BOOL InitInstance();
    };

    class CMainWindow:public CWnd
    {
    public:
    int fnum;
    CString m_nFullName;
    void OnReadImage(int);
    CString m_nPath;
    CString m_nFileTitle;
    BYTE *image;
    int fIndex;    //索引
    CMainWindow();

    protected:
    HDC m_hMemDC;  //与客户区兼容的内存DC句柄
    int m_nWidth;  //raw 图像的宽
    int m_nHeight; //raw 高


    protected:
    virtual void PostNcDestroy();
    afx_msg BOOL OnCreate(LPCREATESTRUCT);
    afx_msg void OnKeyDown(UINT,UINT, UINT);
    afx_msg void OnPaint();
    afx_msg void OnDrawImage(HDC,BYTE*);
    afx_msg void OnDestroy();
    afx_msg void OnFileOpen();
    afx_msg void OnFileSave();
    // afx_msg void OnKeyDown(UINT,UINT, UINT);
    afx_msg void OnDraw();

    DECLARE_MESSAGE_MAP()

    };


    //////////////////////////////////////////////
    //ImageProc.cpp
    #include <afxdlgs.h>
    #include "resource.h"
    #include "ReadRaw.h"

    CMyApp theApp;

    BOOL CMyApp::InitInstance()
    {
    m_pMainWnd=new CMainWindow;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    return TRUE;
    }

    CMainWindow::CMainWindow()
    {
    LPCTSTR  lpszClassName = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
    LoadCursor(NULL,IDC_ARROW),(HBRUSH)(COLOR_WINDOW+1),theApp.LoadIcon(IDI_MAIN));
    CreateEx(NULL,lpszClassName,"raw文件浏览器",
    WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX,
    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL);
    }

    BEGIN_MESSAGE_MAP(CMainWindow,CWnd)
    ON_WM_CREATE()
    ON_WM_PAINT()
    ON_COMMAND(FILE_OPEN,OnFileOpen)
    END_MESSAGE_MAP()


    void CMainWindow::PostNcDestroy()
    {  delete this; }

    BOOL CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    ::SetMenu(m_hWnd,LoadMenu(theApp.m_hInstance,(LPCTSTR)IDR_MAIN));
    CClientDC dc(this);

    //初始化内存DC
    m_hMemDC = CreateCompatibleDC(dc);
    m_nHeight = 0;
    m_nWidth = 0;
    fIndex = 0;
    image=NULL;
    return TRUE;
    }

    void CMainWindow::OnPaint()
    {
    CPaintDC dc(this);

    //复制内存中的DC中的图像到客户区
    BitBlt(dc,0,0,m_nWidth,m_nHeight,m_hMemDC,0,0,SRCCOPY);
    OnDrawImage(dc,image);
    }

    void CMainWindow::OnDestroy()
    { DeleteDC(m_hMemDC);}

    void CMainWindow::OnFileOpen()
    {
    // TODO: Add your command handler code here
    CFileDialog MyFDlg(TRUE, NULL,NULL, OFN_HIDEREADONLY, NULL,NULL );

    MyFDlg.m_ofn.lpstrFilter = "(*.lst;*.raw)\0*.lst;*.raw\0";
          MyFDlg.m_ofn.lpstrInitialDir = " E:\\学习\\courseware\\数字图像试验\\Experiment1 -3\\";
    if (IDOK == MyFDlg.DoModal())
    {
    m_nPath=MyFDlg.GetPathName();
    //CString fnstr;
    m_nFullName=MyFDlg.GetFileName();
    m_nFileTitle = MyFDlg.GetFileTitle();
    if (m_nPath.Right(3) == "lst")
    {
    MessageBox("can not open  the lst");
    }
    else    //
    {
    OnReadImage(fIndex);
    }

    }
    }

    void CMainWindow::OnReadImage(int fIndex)
    {
    FILE *fpImg;

    fpImg = fopen(m_nFullName, "rb");
    if( fpImg==0 )
    {
    AfxMessageBox( "Cannot open the list file", MB_OK, 0 );
    return;
    }

    fread( &m_nWidth, sizeof(int), 1, fpImg);
    fread( &m_nHeight, sizeof(int), 1, fpImg);

    // BYTE *image;
    if(image)
    delete image;
    image = new BYTE[m_nWidth*m_nHeight];

    fread(image,sizeof(BYTE),m_nWidth*m_nHeight,fpImg);
    ::InvalidateRect(m_hWnd,NULL,TRUE);
    fclose(fpImg);

    }

    void CMainWindow::OnDrawImage(HDC dc,BYTE *image)
    {
    int gray;
    for(int i=0;i <m_nHeight;i++)
    {
    for(int j=0;j <m_nWidth;j++)
    {
    gray=image[i*m_nWidth+j];
    SetPixel(dc,j,i,RGB(gray,gray,gray));
    }
    }
    }


    void CMainWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // TODO: Add your message handler code here and/or call default
    if( nChar == VK_NEXT)
    {
    if( fIndex < fnum )
    {
    fIndex++;
    OnReadImage( fIndex );
    }
    }
    if( nChar == VK_PRIOR )
    {
    if( fIndex > 0 )
    {
    fIndex--;
    OnReadImage( fIndex );
    }
    }
    }


    问题是当我按下PageDowm  PageUp时没有反应。请问是什么原因?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      7

    发表于:2008-04-26 18:12:511楼 得分:5
    没看到你往m_hMemDC上选入内存位图或者你的位图啊,难道m_hMemDC仅仅是用来画个黑色(还不一定)背景?
    再则,你算然给OnReadImage()函数传了一个参数,但是函数中根本没有用到。最后,你的绘制代码:
    C/C++ code
    gray=image[i*m_nWidth+j]; SetPixel(dc,j,i,RGB(gray,gray,gray));
    令我很不理解,根据这个样子,好像你的图像格式是每个字节表示一个点的灰度?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guozhuyz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-26 21:01:302楼 得分:0
    给OnReadImage()函数传了一个参数,主要是为了在响应PageDown和PageUp时作为一个索引用的。
    我的图像的格式是  width height gray 。。。。。。gray。这样的。所以我就用那个
    SetPixel()了。
    我也不是很懂,我这是第一次写图像这方面的,而且也是刚开始用windows写程序。
    还请多多指教。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      7

    发表于:2008-04-26 21:55:123楼 得分:5
    可是你那个索引根本没用,也就是说每次读的都是同样的数据。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guozhuyz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-26 22:36:294楼 得分:0
    这样的话,我是不是把路径或者是其的作为搜索条件呢。?还是有什么好办法呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      7

    发表于:2008-04-27 00:18:265楼 得分:5
    这得看你是什么意思,你所谓的不同图片是不同的文件呢,还是文件的不同部分。

    我理解为不同文件,那么可以先读取一个文件列表,变化的时候从文件列表中取不同的文件名进行读取;或者事先把文件都读入一个数组,变化的时候索引到不同的数据。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guozhuyz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-29 10:26:106楼 得分:0
    好的,非常谢谢你的帮助。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • UltraBejing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-30 21:33:097楼 得分:5
    接分是王道!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved