读入图片 我想做一个文本框,或者图片框里读入一张图片,有一个路径选择按钮,一个路径编辑框。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BmpProgCtrl.cpp:CBmpProgCtrl::CBmpProgCtrl(){ m_nLower = 1; m_nUpper = 100; m_nStep = 1; m_nPos = 0; pDCBack = new CDC; bmpBack.LoadBitmap(IDB_BACK);}CBmpProgCtrl::~CBmpProgCtrl(){ delete pDCBack;}BEGIN_MESSAGE_MAP(CBmpProgCtrl, CStatic) //{{AFX_MSG_MAP(CBmpProgCtrl) ON_WM_PAINT() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CBmpProgCtrl メッセージ ハンドラvoid CBmpProgCtrl::OnPaint() { m_length = (float)m_nPos/(m_nUpper-m_nLower); CPaintDC dc(this); // 描画用のデバイス コンテキスト // TODO: この位置にメッセージ ハンドラ用のコードを追加してください GetClientRect(&m_rect); pDCBack->CreateCompatibleDC(&dc); bmpBack.GetBitmap(&bmback); pDCBack->SelectObject(bmpBack); dc.StretchBlt(0,0,m_rect.Width(),m_rect.Height(),pDCBack,0,0,bmback.bmWidth,bmback.bmHeight,SRCCOPY); pDCBack->DeleteDC(); // 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません}///可以直接读取图片。void CNyuRyokuDlg::OnInputFileBtn() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください static char BASED_CODE szFilter[]="All Files(*.*)|*.*||"; // CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL); if(dlg.DoModal() == IDOK) { // CFile file; file.Open(dlg.GetPathName(),CFile::modeRead); CEdit * pEdit = (CEdit*)GetDlgItem(IDC_INPUT_PATH_EDT); pEdit->SetWindowText(file.GetFilePath()); file.Close(); }}//可以得到打开文件的路径。但是怎么用按钮单击事件打开图片呢? 用OnDraw(),还是OnPaint()呢?请提示一下。谢谢? 不是,是我自己程序里面的东西,非常急。连着日文都出来了。赫赫。我有两个方案,1:用picturebox装载图片:继承一个cview的类。用ondraw().void CpicView::OnDraw(CDC* pDC){ CDocument* pDoc = GetDocument(); // TODO: この位置に描画用のコードを追加してください IPicture *pPic; IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; if (file.Open("c:/test.jpg",CFile::modeRead)&&file.GetStatus("c:/test.jpg", fstatus)&& ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { if ((pvData = GlobalLock(hGlobal)) != NULL) { file.ReadHuge(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID* )&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); double fX,fY; fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/ ((double)pDC->GetDeviceCaps(HORZSIZE)*100.0); fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/ ((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight, hmWidth,-hmHeight,NULL))) AfxMessageBox("Failed To Render The picture!"); pPic->Release(); } else AfxMessageBox("Error Loading Picture From Stream!"); } } } else AfxMessageBox("Can't Open Image File!");}//以上代码在sdi容器里面可以装载图片。但是怎么和图片框关联呢?方案2:用静态文本框装载图片:继承一个静态的类CStatic.类名:CBmpProgCtrlvoid CBmpProgCtrl::OnPaint() { m_length = (float)m_nPos/(m_nUpper-m_nLower); CPaintDC dc(this); // 描画用のデバイス コンテキスト // TODO: この位置にメッセージ ハンドラ用のコードを追加してください GetClientRect(&m_rect); pDCBack->CreateCompatibleDC(&dc); bmpBack.GetBitmap(&bmback); pDCBack->SelectObject(bmpBack); dc.StretchBlt(0,0,m_rect.Width(),m_rect.Height(),pDCBack,0,0,bmback.bmWidth,bmback.bmHeight,SRCCOPY); pDCBack->DeleteDC(); // 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません}可以在界面启动就装载图片。可是还是不知道怎么相应button事件,请各位详细赐教。十分感激!!! void CNyuRyokuDlg::OnInputFileBtn() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください static char BASED_CODE szFilter[]="All Files(*.*)|*.*||"; // CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL); if(dlg.DoModal() == IDOK) { // CFile file; file.Open(dlg.GetPathName(),CFile::modeRead); CEdit * pEdit = (CEdit*)GetDlgItem(IDC_INPUT_PATH_EDT); pEdit->SetWindowText(file.GetFilePath()); m_Path = file.GetFilePath(); file.Close(); }} void CKiriDasuDlg::OnPaint() { // CPaintDC dc(this); // 描画用のデバイス コンテキスト // TODO: この位置にメッセージ ハンドラ用のコードを追加してください // 描画用メッセージとして CDialog::OnPaint() を呼び出してはいけません HBITMAP hBitmap; BITMAP BM; CDC MemDC; CClientDC ClientDC(this); MemDC.CreateCompatibleDC(&ClientDC); hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_Path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); MemDC.SelectObject(&hBitmap); ::GetObject(hBitmap,sizeof(BM),&BM); //使用格式与方法一同 //ClientDC.BitBlt(0,0,BM.bmWidth,BM.bmHeight,&MemDC,0,0,SRCCOPY); // CStatic *pStatic = (CStatic *)GetDlgItem(IDC_KIRIDASU_IMG) ; pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE); int nLength = m_Path.GetLength(); char* sz=new char(nLength); sz=m_Path.GetBuffer(0); pStatic->SetBitmap(hBitmap); } VC 帮忙看下该报表怎么实现(见图) CTimeSpan时间差范围问题 DC句柄要释放吗? inline hook调用原函数 关于列表快速显示大量数据的疑问. 快速列出大量数据的显示效率疑问.有关虚拟列表技术. 请问怎样用指定的应用程序打开特定类型的文件 头让我写个WNet的示例程序.....WNet有什么用啊?? 永久对象的作用? 急问,在Convert SAX to DOM 时... “多文档”Release 遇到一个棘手的问题 在线急等~~~~~~在CEdit里面显示utf8码?咋弄呀 从字符串转换成整形时,如何判断该字符串内容为纯数字?
CBmpProgCtrl::CBmpProgCtrl()
{
m_nLower = 1;
m_nUpper = 100;
m_nStep = 1;
m_nPos = 0;
pDCBack = new CDC;
bmpBack.LoadBitmap(IDB_BACK);
}CBmpProgCtrl::~CBmpProgCtrl()
{
delete pDCBack;
}BEGIN_MESSAGE_MAP(CBmpProgCtrl, CStatic)
//{{AFX_MSG_MAP(CBmpProgCtrl)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CBmpProgCtrl メッセージ ハンドラvoid CBmpProgCtrl::OnPaint()
{
m_length = (float)m_nPos/(m_nUpper-m_nLower);
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
GetClientRect(&m_rect);
pDCBack->CreateCompatibleDC(&dc);
bmpBack.GetBitmap(&bmback);
pDCBack->SelectObject(bmpBack);
dc.StretchBlt(0,0,m_rect.Width(),m_rect.Height(),pDCBack,0,0,bmback.bmWidth,bmback.bmHeight,SRCCOPY);
pDCBack->DeleteDC();
// 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません
}///
可以直接读取图片。void CNyuRyokuDlg::OnInputFileBtn()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
static char BASED_CODE szFilter[]="All Files(*.*)|*.*||";
//
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT,szFilter,NULL);
if(dlg.DoModal() == IDOK)
{
//
CFile file;
file.Open(dlg.GetPathName(),CFile::modeRead);
CEdit * pEdit = (CEdit*)GetDlgItem(IDC_INPUT_PATH_EDT);
pEdit->SetWindowText(file.GetFilePath());
file.Close();
}
}
//可以得到打开文件的路径。但是怎么用按钮单击事件打开图片呢?
我有两个方案,1:
用picturebox装载图片:
继承一个cview的类。用ondraw().
void CpicView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: この位置に描画用のコードを追加してください IPicture *pPic;
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open("c:/test.jpg",CFile::modeRead)&&file.GetStatus("c:/test.jpg",
fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*
)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,
hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
pPic->Release();
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
else
AfxMessageBox("Can't Open Image File!");}//
以上代码在sdi容器里面可以装载图片。
但是怎么和图片框关联呢?
方案2:
用静态文本框装载图片:
继承一个静态的类CStatic.类名:CBmpProgCtrlvoid CBmpProgCtrl::OnPaint()
{
m_length = (float)m_nPos/(m_nUpper-m_nLower);
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
GetClientRect(&m_rect);
pDCBack->CreateCompatibleDC(&dc);
bmpBack.GetBitmap(&bmback);
pDCBack->SelectObject(bmpBack);
dc.StretchBlt(0,0,m_rect.Width(),m_rect.Height(),pDCBack,0,0,bmback.bmWidth,bmback.bmHeight,SRCCOPY);
pDCBack->DeleteDC();
// 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません
}
可以在界面启动就装载图片。可是还是不知道怎么相应button事件,请各位详细赐教。十分感激!!!
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
static char BASED_CODE szFilter[]="All Files(*.*)|*.*||";
//
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT,szFilter,NULL);
if(dlg.DoModal() == IDOK)
{
//
CFile file;
file.Open(dlg.GetPathName(),CFile::modeRead);
CEdit * pEdit = (CEdit*)GetDlgItem(IDC_INPUT_PATH_EDT);
pEdit->SetWindowText(file.GetFilePath());
m_Path = file.GetFilePath();
file.Close();
}
}
{
// CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
// 描画用メッセージとして CDialog::OnPaint() を呼び出してはいけません HBITMAP hBitmap;
BITMAP BM;
CDC MemDC;
CClientDC ClientDC(this);
MemDC.CreateCompatibleDC(&ClientDC);
hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_Path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
MemDC.SelectObject(&hBitmap);
::GetObject(hBitmap,sizeof(BM),&BM);
//使用格式与方法一同
//ClientDC.BitBlt(0,0,BM.bmWidth,BM.bmHeight,&MemDC,0,0,SRCCOPY);
//
CStatic *pStatic = (CStatic *)GetDlgItem(IDC_KIRIDASU_IMG) ;
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
int nLength = m_Path.GetLength();
char* sz=new char(nLength);
sz=m_Path.GetBuffer(0);
pStatic->SetBitmap(hBitmap);
}