求助。 我想實作這樣一個功能,程式啟動讀取資料庫相關資料,記憶體中生成兩張圖,之后在界面上回圈滾動。現在圖片能生成并顯示,但是不能自動移動,需要切換出去再切換回來才可見移動,實在不知道為什么。代碼如下:
public://創建單張快取試圖
// CDlgController dialog
class CDlgController : public CDialog
{
class CSingleQueuePic
{
public:
int nStartX;
int nStartY;
int nWidth;
int nHeight;
CDC MemDC;
CBitmap MemBitmap;
HBITMAP m_bitmap;
int nPicNum;
public:
CSingleQueuePic()
{
nStartX = 0;
nStartY = 0;
nPicNum = 0;
nWidth = 0;
nHeight =0;
}
virtual ~CSingleQueuePic() {}
};
CSingleQueuePic* m_pSingleQueuePic;
COBList<CSingleQueuePic> m_lstSingleQueuePic;
CSingleQueuePic* CreateSinglePage(COBList<CQueueCall>* m_SinglePageListQueue, CDC* pDC, int nNum);
};
// DlgController.cpp : implementation file
//創建單張位圖,程式啟動,執行一次
CDlgController::CSingleQueuePic* CDlgController::CreateSinglePage(COBList<CQueueCall>* m_SinglePageListQueue, CDC* pDC, int nNum)
{
CSingleQueuePic* pSingleQueuePic = new CSingleQueuePic;
pSingleQueuePic->nStartX = 0;
pSingleQueuePic->nStartY = 0;
pSingleQueuePic->nPicNum = nNum;
//雙快取解決重繪重畫時閃屏問題 20181110
int nWidth =m_recQueueCall.Width();
int nHeight = m_recQueueCall.Height();
pSingleQueuePic->nWidth = nWidth;
pSingleQueuePic->nHeight = nHeight;
// CDC MemDC; //首先定義一個顯示設備物件
// CBitmap MemBitmap;//定義一個位圖物件
//隨后建立與螢屏顯示兼容的記憶體顯示設備
pSingleQueuePic->MemDC.CreateCompatibleDC(NULL);
//下面建立一個與螢屏顯示兼容的位圖,位圖的大小,用視窗的大小
pSingleQueuePic->MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//將位圖選入到記憶體顯示設備中
//只有選入了位圖的記憶體顯示設備才有地方繪圖,畫到指定的位圖上
CBitmap *pOldBit=pSingleQueuePic->MemDC.SelectObject(&pSingleQueuePic->MemBitmap);
//先用背景色將位圖清除干凈
//你也可以用自己應該用的顏色
pSingleQueuePic->MemDC.FillSolidRect(0,0,nWidth,nHeight, this->m_pController->m_clrControllerBackground);
CFont* pFont = pSingleQueuePic->MemDC.SelectObject(this->m_pFontQueueCall);
pDC->SetBkMode(TRANSPARENT);
CString strBuffer = _T("繪圖測驗");
CSize txtsize;
txtsize = pSingleQueuePic->MemDC.GetTextExtent(strBuffer);
pSingleQueuePic->MemDC.TextOut(100, 100, strBuffer);
pSingleQueuePic->MemDC.SelectObject(pFont);
//將記憶體中的圖拷貝到螢屏上進行顯示
// pDC->BitBlt(m_recQueueCall.left,m_recQueueCall.top,this->m_recQueueCall.Width(),this->m_recQueueCall.Height(),&pSingleQueuePic->MemDC,0,0,SRCCOPY);
HBITMAP hBitMap = (HBITMAP)(pSingleQueuePic->MemBitmap);
this->SaveBmp(hBitMap,"D:\\tes1t.BMP");
return pSingleQueuePic;
}
//回圈滾動圖片,OnTimer(),OnPaint()中執行
BOOL CDlgController::DrawQueueCall(CDC* pDC)
{
if(CRunTime::GetGeneral()->m_bHideName)
this->m_bVideo = TRUE;
//
OBPOS POS = NULL;
LONG nLine = 0;
//畫圖
for (CSingleQueuePic* pSingleQueuePic = this->m_lstSingleQueuePic.GetHead(POS); pSingleQueuePic != NULL; pSingleQueuePic = this->m_lstSingleQueuePic.GetNext(POS), nLine++)
{
if (pSingleQueuePic != NULL && pSingleQueuePic->nPicNum == 0)
{
pSingleQueuePic->nStartY-=10;
if (pSingleQueuePic->nStartY<-m_recQueueCall.Height())
{
pSingleQueuePic->nStartY =0 ;
}
pDC->BitBlt(m_recQueueCall.left,m_recQueueCall.top+pSingleQueuePic->nStartY,this->m_recQueueCall.Width(),this->m_recQueueCall.Height(),&pSingleQueuePic->MemDC,0,0,SRCCOPY);
}
// InvalidateRect(m_recQueueCall,TRUE);
}
return TRUE;
}
利用雙緩沖機制,先生成位圖,后滾動回圈。現在問題主要是圖片需要切換一下程式,才可見移動。請大神幫忙看看。搞了兩天了。
uj5u.com熱心網友回復:
DrawQueueCall 在哪里被呼叫的?uj5u.com熱心網友回復:
Ontimer和onpaint都有呼叫,切換一下就可重繪移動。不能自動移動。uj5u.com熱心網友回復:
Ontimer和Onpaint都有呼叫,切換一下界面再切回來就可以圖片已經移動。但當前界面不能自動移動。uj5u.com熱心網友回復:
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
SetTimer(1, 2000, NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_BitmpIndex = !m_BitmpIndex;
Invalidate();
CDialog::OnTimer(nIDEvent);
}
void DrawImage(HDC hDstDC, RECT rcRect, HBITMAP hBitmap)
{
HDC hMemDC = NULL;
HGDIOBJ hOldBmp = NULL;
BITMAP bmpInfo = {0};
if(hDstDC && hBitmap
&& GetObject(hBitmap, sizeof(bmpInfo), &bmpInfo) //獲取位圖資訊
&& 1)
{
//創建記憶體DC
hMemDC = CreateCompatibleDC(hDstDC);
//選入位圖
hOldBmp = SelectObject(hMemDC, hBitmap);
//保存DC現場
int nSaveDC = SaveDC(hDstDC);
//縮放半色調顯示
SetStretchBltMode(hDstDC, HALFTONE);
//縮放貼圖
StretchBlt(hDstDC,
rcRect.left, rcRect.top, rcRect.right-rcRect.left, rcRect.bottom-rcRect.top,
hMemDC,
0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY);
//恢復DC現場
RestoreDC(hDstDC, nSaveDC);
}
//恢復選入的位圖
if(hMemDC && hOldBmp)
{
SelectObject(hMemDC, hOldBmp);
}
//洗掉DC
if(hMemDC)
{
DeleteDC(hMemDC);
}
}
void CTestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
CDC *pDC = GetDC();
RECT rcClient;
GetClientRect(&rcClient);
CBitmap mBmp;
mBmp.LoadBitmap( m_BitmpIndex? IDB_BITMAP2:IDB_BITMAP1);
DrawImage(pDC->m_hDC, rcClient, mBmp);
ReleaseDC(pDC);
}
}
uj5u.com熱心網友回復:
Invalidate();UpdateWindow();//立即重繪
試試。
uj5u.com熱心網友回復:
不要在定時器中直接呼叫DrawQueueCall,定時器呼叫Invalidate()就好了,讓它自己去畫。uj5u.com熱心網友回復:
去掉那些多余的垃圾void CTestDlg::OnPaint()
{
CPaintDC dc(this);
RECT rcClient;
GetClientRect(&rcClient);
CBitmap mBmp;
mBmp.LoadBitmap( m_BitmpIndex? IDB_BITMAP2:IDB_BITMAP1);
DrawImage(dc.GetSafeHdc(), rcClient, mBmp);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/25245.html
標籤:界面
下一篇:請推薦關于界面美化方面的書
