vc图像控件显示图像中的某一部位的问题?
我想在图像控件中显示比控件大很多的图片,在一开始只显示图像的最左部分,然后我想按一个按钮,能够使图像往右一点显示,这样一直按,一点点的就把整张图片都显示了一遍。问题:我就...
我想在图像控件中显示比控件大很多的图片,在一开始只显示图像的最左部分,然后我想按一个按钮,能够使图像往右一点显示,这样一直按,一点点的就把整张图片都显示了一遍。
问题:我就想解决里面的那个技术,图像在控件中显示的问题,怎么使其能精确的显示我指定图像的某一个区域。
请一定得说能解决我所指的问题。有用的。 展开
问题:我就想解决里面的那个技术,图像在控件中显示的问题,怎么使其能精确的显示我指定图像的某一个区域。
请一定得说能解决我所指的问题。有用的。 展开
2个回答
展开全部
如果是显示BMP图的话,可以用这个函数:
BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
hdcDest:指向目标设备环境的句柄。
nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
nWidth:指定源和目标矩形区域的逻辑宽度。
nHeight:指定源和目标矩形区域的逻辑高度。
hdcSrc:指向源设备环境的句柄。
nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
按你的要求,光栅操作代码可以用SRCCOPY,将源矩形区域直接拷贝到目标矩形区域。
下面列一些其他的常见的光栅操作代码:
BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
DSTINVERT:表示使目标矩形区域颜色取反。
MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
PATCOPY:将特定的模式拷贝到目标位图上。
PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
hdcDest:指向目标设备环境的句柄。
nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
nWidth:指定源和目标矩形区域的逻辑宽度。
nHeight:指定源和目标矩形区域的逻辑高度。
hdcSrc:指向源设备环境的句柄。
nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
按你的要求,光栅操作代码可以用SRCCOPY,将源矩形区域直接拷贝到目标矩形区域。
下面列一些其他的常见的光栅操作代码:
BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
DSTINVERT:表示使目标矩形区域颜色取反。
MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
PATCOPY:将特定的模式拷贝到目标位图上。
PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
展开全部
#include "interface.h"
#pragma once
class Controller :
public IController
{
//构造函数与析构函数
public:
Controller(void);
~Controller(void);
//重写方法
public:
virtual void draw(HWND wnd, RECT & rc);
virtual void on_btn_down_pressed();
virtual void on_btn_left_pressed();
virtual void on_btn_right_pressed();
virtual void on_btn_up_pressed();
virtual void InitControl( IBox * p_in );
//内部调用方法
private:
void ReDrawBitmap();
private:
HBITMAP m_Bitmap;
IBox* m_pBox;
SIZE m_Size;
};
Controller::Controller()
{
}
Controller::~Controller(void)
{
}
void Controller::draw(HWND wnd, RECT & rc)
{
HDC hDC = GetDC(wnd);
CRect rt;
rt.CopyRect(&rc);
rt.OffsetRect(0,0);
HDC hCompationDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC,rt.Width(),rt.Height());
HGDIOBJ hOldCompationDC = SelectObject(hCompationDC,hBitmap);
HBRUSH hBrush = CreateHatchBrush(HS_DIAGCROSS,COLORREF(0xC0C0C0));
FillRect(hCompationDC,&rc,hBrush);
HDC hBitmapDC = CreateCompatibleDC(hDC);
HBITMAP hOldBitmap =(HBITMAP) SelectObject(hBitmapDC,this->m_Bitmap);
BitBlt(hCompationDC,0,0,rt.Width(),rt.Height(),hBitmapDC,m_Size.cx,m_Size.cy,SRCCOPY);
SelectObject(hCompationDC,this->m_Bitmap);
SetTextColor(hCompationDC,COLORREF(0xFF));
SetBkMode(hCompationDC,1);
TextOut(hCompationDC,10,10,_T("这是示例程序"),6);
BitBlt(hDC,0,0,rt.Width(),rt.Height(),hCompationDC,0,0,SRCCOPY);
SelectObject(hCompationDC,hOldCompationDC);
DeleteDC(hCompationDC);
DeleteObject(hBitmap);
DeleteObject(hBrush);
SelectObject(hBitmapDC,hOldBitmap);
DeleteDC(hBitmapDC);
ReleaseDC(wnd,hDC);
}
void Controller::on_btn_down_pressed()
{
m_Size.cy -= 5;
ReDrawBitmap();
}
void Controller::on_btn_left_pressed()
{
m_Size.cx += 5;
ReDrawBitmap();
}
void Controller::on_btn_up_pressed()
{
m_Size.cy += 5;
ReDrawBitmap();
}
void Controller::on_btn_right_pressed()
{
m_Size.cx -= 5;
ReDrawBitmap();
}
void Controller::InitControl( IBox * p_in )
{
this->m_pBox = p_in;
HINSTANCE hInstance = hInst;
m_Bitmap = LoadBitmap(hInstance, (LPCWSTR)IDB_BITMAP);
m_Size.cx = 0;
m_Size.cy = 0;
}
void Controller::ReDrawBitmap()
{
if (this->m_Bitmap != NULL)
{
RECT rt = m_pBox->getDrawRect();
HWND hWnd = m_pBox->getWND();
InvalidateRect(hWnd,&rt,false);
}
}
#pragma once
class Controller :
public IController
{
//构造函数与析构函数
public:
Controller(void);
~Controller(void);
//重写方法
public:
virtual void draw(HWND wnd, RECT & rc);
virtual void on_btn_down_pressed();
virtual void on_btn_left_pressed();
virtual void on_btn_right_pressed();
virtual void on_btn_up_pressed();
virtual void InitControl( IBox * p_in );
//内部调用方法
private:
void ReDrawBitmap();
private:
HBITMAP m_Bitmap;
IBox* m_pBox;
SIZE m_Size;
};
Controller::Controller()
{
}
Controller::~Controller(void)
{
}
void Controller::draw(HWND wnd, RECT & rc)
{
HDC hDC = GetDC(wnd);
CRect rt;
rt.CopyRect(&rc);
rt.OffsetRect(0,0);
HDC hCompationDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC,rt.Width(),rt.Height());
HGDIOBJ hOldCompationDC = SelectObject(hCompationDC,hBitmap);
HBRUSH hBrush = CreateHatchBrush(HS_DIAGCROSS,COLORREF(0xC0C0C0));
FillRect(hCompationDC,&rc,hBrush);
HDC hBitmapDC = CreateCompatibleDC(hDC);
HBITMAP hOldBitmap =(HBITMAP) SelectObject(hBitmapDC,this->m_Bitmap);
BitBlt(hCompationDC,0,0,rt.Width(),rt.Height(),hBitmapDC,m_Size.cx,m_Size.cy,SRCCOPY);
SelectObject(hCompationDC,this->m_Bitmap);
SetTextColor(hCompationDC,COLORREF(0xFF));
SetBkMode(hCompationDC,1);
TextOut(hCompationDC,10,10,_T("这是示例程序"),6);
BitBlt(hDC,0,0,rt.Width(),rt.Height(),hCompationDC,0,0,SRCCOPY);
SelectObject(hCompationDC,hOldCompationDC);
DeleteDC(hCompationDC);
DeleteObject(hBitmap);
DeleteObject(hBrush);
SelectObject(hBitmapDC,hOldBitmap);
DeleteDC(hBitmapDC);
ReleaseDC(wnd,hDC);
}
void Controller::on_btn_down_pressed()
{
m_Size.cy -= 5;
ReDrawBitmap();
}
void Controller::on_btn_left_pressed()
{
m_Size.cx += 5;
ReDrawBitmap();
}
void Controller::on_btn_up_pressed()
{
m_Size.cy += 5;
ReDrawBitmap();
}
void Controller::on_btn_right_pressed()
{
m_Size.cx -= 5;
ReDrawBitmap();
}
void Controller::InitControl( IBox * p_in )
{
this->m_pBox = p_in;
HINSTANCE hInstance = hInst;
m_Bitmap = LoadBitmap(hInstance, (LPCWSTR)IDB_BITMAP);
m_Size.cx = 0;
m_Size.cy = 0;
}
void Controller::ReDrawBitmap()
{
if (this->m_Bitmap != NULL)
{
RECT rt = m_pBox->getDrawRect();
HWND hWnd = m_pBox->getWND();
InvalidateRect(hWnd,&rt,false);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询