1. 程式人生 > >VC實現透明圖的閃屏對話方塊動畫

VC實現透明圖的閃屏對話方塊動畫

#include "stdafx.h"
#include "math.h"
#include "resource.h"
#include "SplashWnd.h"


// CSplashWnd

IMPLEMENT_DYNAMIC(CSplashWnd, CWnd)

bool ExitFlag;

DWORD WINAPI  On_Timer(LPVOID pParam);

CSplashWnd::CSplashWnd()
: m_strInfo(_T("Initializing..."))
, m_dbOldSpeed(-1)
{
	ImageFrom_IDResource(IDB_PNG57,"PNG",&image);
	//m_Bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1)); //Load Bitmap 
	//m_Bitmap.GetBitmap(&bmBitmap);        //Get Bitmap Info 
	//m_lWidth=bmBitmap.bmWidth,  //Bitmap Width = Splash Window Width 
	//m_lHeight=bmBitmap.bmHeight, //Bitmap Height = Splash Window Height 
	m_lWidth=image.GetWidth();  
	m_lHeight=image.GetHeight();
}

CSplashWnd::~CSplashWnd()
{
	if(g_hThread!=NULL)
	{
		CloseHandle(g_hThread);
	}

}


BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)
ON_WM_PAINT() 
ON_WM_NCDESTROY()
END_MESSAGE_MAP()



// CSplashWnd 訊息處理程式

void CSplashWnd::DeleteSplash() 
{
	ExitFlag=true;
}
void CSplashWnd::CreateSplash() 
{ 
//Create Splash Window 
CWnd::CreateEx(0, 
  AfxRegisterWndClass( 
  0, 
  AfxGetApp()->LoadStandardCursor(IDC_UPARROW)), 
  NULL, 
  //            "SplashWindow Sample", 
  WS_POPUP, 
  0, 
  0, 
  m_lWidth,  //Bitmap Width = Splash Window Width 
  m_lHeight, //Bitmap Height = Splash Window Height 
  NULL, 
  NULL, 
  NULL); 

this->CenterWindow(); 
this->ShowWindow(SW_SHOW);
this->UpdateWindow(); 
ExitFlag=false;
g_hThread= CreateThread(0,NULL,On_Timer,(LPTHREAD_START_ROUTINE)this,0,NULL);
} 

void CSplashWnd::OnPaint() 
{ 

    CPaintDC dc(this); 

    //CBrush brush; 
    //brush.CreateSolidBrush(RGB(64,64,255)); 
    //dc.SelectObject(&brush); 
    //dc.Rectangle(0,0,bmBitmap.bmWidth,bmBitmap.bmHeight); 

    //mMemDC.CreateCompatibleDC(NULL); //Create Memory DC 
    //Old_Bitmap = mMemDC.SelectObject(&m_Bitmap); //Select DC 
    //int num = bmBitmap.bmWidth/40; 
    //dc.StretchBlt(0,0,bmBitmap.bmWidth,bmBitmap.bmHeight,&mMemDC,0,0,bmBitmap.bmWidth,bmBitmap.bmHeight,SRCCOPY); 
	//mMemDC.SelectObject(Old_Bitmap); //Select Bitmap 
	CRect rect; 
	rect.top =0;
	rect.left =0;
	rect.bottom=m_lHeight;   
	rect.right =m_lWidth; 
    image.Draw(dc.m_hDC, rect);//將圖片繪製到picture表示的區域內  

	CFont font;
	font.CreateFont(28, 0, 0, 0, FW_NORMAL,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Times New Roman");
	dc.SetBkMode(TRANSPARENT);
	dc.SetTextColor(RGB(255,255,255));    //Static控制元件1的字型顏色-紅色
	dc.SelectObject(&font); 
	CRect m_RectInfoShow(22,728,1000,760);//資訊區域

    dc.DrawText(m_strInfo,m_RectInfoShow, DT_LEFT | DT_EDITCONTROL | DT_WORDBREAK);
    font.DeleteObject(); 

} 

void CSplashWnd::ImageFrom_IDResource(UINT nID, LPCTSTR sTR, CImage *  pImg) 
{
	HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(nID), _T(sTR));  
    if(hrsrc)  
    {  
      HGLOBAL hglb = LoadResource(NULL, hrsrc);  
      LPVOID lpsz = LockResource(hglb);  
      ULARGE_INTEGER srcSize;  
      srcSize.QuadPart = SizeofResource(NULL, hrsrc);  
        
      IStream * pStream = NULL;  
      CreateStreamOnHGlobal(NULL, TRUE, &pStream);   
      if(pStream)  
      {  
        pStream->SetSize(srcSize);  
        DWORD cbWritten = 0;  
        pStream->Write(lpsz, srcSize.LowPart, &cbWritten);  
          
		pImg->Load(pStream);  
        //VERIFY( m_BkImage.Load(pStream) == S_OK );  
        pStream->Release();  
      }  
    }  
}
void CSplashWnd::SetInfo(CString info)
{
	m_strInfo=info;
}
//void CSplashWnd::OnTimer(UINT_PTR nIDEvent)
DWORD WINAPI On_Timer(LPVOID pParam)
{
	CSplashWnd *pDlg = (CSplashWnd *)pParam;
	int iInfo;
	static int nDisplay=-1;
	while(!ExitFlag)
   {
		if(pDlg->m_strInfo.Find("Initializing")>-1) 
		{
			nDisplay=nDisplay>3?0:nDisplay+1;   
			switch(nDisplay)   
			{   
			case 0: pDlg->m_strInfo="Initializing"; break;   
			case 1: pDlg->m_strInfo="Initializing."; break;   
			case 2: pDlg->m_strInfo="Initializing.."; break;   
			case 3: pDlg->m_strInfo="Initializing..."; break;   
			}          
		}
		if((iInfo=pDlg->m_strInfo.Find('$'))>1)
			pDlg->m_strInfo=pDlg->m_strInfo.Mid(1,iInfo-1);
		CDC *pDc;
		pDc=pDlg->GetDC();
		CDC  * pMemDc=NULL; //載入背景圖片的記憶體DC
		CRect rect; 
		rect.top =0;
		rect.left =0;
		rect.bottom= pDlg->m_lHeight;   
		rect.right = pDlg->m_lWidth; 

		pMemDc=new CDC;
		pMemDc->CreateCompatibleDC(pDc);
		CBitmap bmp;//這裡的Bitmap是必須的,否則當心弄出一個大黑塊哦。
		bmp.CreateCompatibleBitmap(pDc,rect.Width(),rect.Height());
		pMemDc->SelectObject(&bmp);

		
		pDlg->image.Draw(pMemDc->m_hDC, rect);//將圖片繪製到picture表示的區域內  

		CFont font;
		//font.CreateFont(15, 0, 0, 0, FW_BOLD,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, L"Times New Roman");
		font.CreateFont(40, 0, 0, 0, FW_NORMAL,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Times New Roman");
		pMemDc->SetBkMode(TRANSPARENT);
		pMemDc->SetTextColor(RGB(255,255,255));    //Static控制元件1的字型顏色-紅色
		pMemDc->SelectObject(&font); 

		CString str;
		CRect m_RectDateTimeShow(642,48,1000,86);//日期時間
		CTime time = CTime::GetCurrentTime();       
		str.Format("%04d-%02d-%02d %02d:%02d:%02d",time.GetYear(),time.GetMonth(),time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());  
		pMemDc->DrawText(str,m_RectDateTimeShow, DT_CENTER | DT_EDITCONTROL | DT_WORDBREAK);
		font.DeleteObject(); 

		font.CreateFont(28, 0, 0, 0, FW_NORMAL,FALSE, FALSE, FALSE, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Times New Roman");
		pMemDc->SetBkMode(TRANSPARENT);
		pMemDc->SetTextColor(RGB(255,255,255));    //Static控制元件1的字型顏色-紅色
		pMemDc->SelectObject(&font); 
		CRect m_RectInfoShow(22,728,1000,760);//資訊區域
		pMemDc->DrawText( pDlg->m_strInfo,m_RectInfoShow, DT_LEFT | DT_EDITCONTROL | DT_WORDBREAK);
		font.DeleteObject(); 

		double SpeedVal=0.0;
		pDlg->m_dbOldSpeed=SpeedVal;
		CPen RectPen(PS_SOLID,5,RGB(255,0,0));
		pMemDc->SelectObject(&RectPen); 
		pMemDc->MoveTo(313,282);
		pMemDc->LineTo((int)(313+cos((360-(180-(0+SpeedVal*3.38/5*180/27)))*PI/180)*200),(int)(282+sin((360-(180-(0+SpeedVal*3.38/5*180/27)))*PI/180)*200));
		RectPen.DeleteObject();
		pDc->BitBlt(0,0,pDlg->m_lWidth,pDlg->m_lHeight,pMemDc,0,0,SRCCOPY);
		bmp.DeleteObject();
		pMemDc->DeleteDC();
		pDc->DeleteDC();

		Sleep(500);
	}
	//CWnd::OnTimer(nIDEvent);
	return true;
}

void CSplashWnd::OnNcDestroy()
{
	CWnd::OnNcDestroy();

	::PostQuitMessage(0);//為了使執行緒自動退出. 
}
使用這個類,需要在專案中新增PNG圖片資源,使用時注意新增資源
IDB_PNG57
在專案上右鍵新增現有專案新增這兩個檔案.

相關推薦

VC實現透明對話方塊動畫

#include "stdafx.h" #include "math.h" #include "resource.h" #include "SplashWnd.h" // CSplashWnd IMPLEMENT_DYNAMIC(CSplashWnd, CWnd) bool ExitFlag; DW

小程序image使用mode大加載的問題

wid 事件 pre bin 小程序 true mod 賦值 項目 項目中用到了一個高度為8000多px的圖片,寫死高度不合適,用小程序的mode的widthFix屬性。因為小程序加載的模式會默認先加載出image的默認高度300*150,之後再裁剪圖片的自適應高度,就會出

通過 background-size:cover 實現背景

在寫主題樣式的時候經常會碰到用背景圖鋪滿整個背景的需求,這裡分享下使用方法 需要的效果 1、圖片以背景的形式鋪滿整個螢幕,不留空白區域 2、保持影象的縱橫比(圖片不變形) 3、圖片居中 4、不出現滾動條 5、多瀏覽器支援 以圖片bg.jpg為例 最簡單,最高效的方法

vue實現箭頭向下的對話方塊

<template> <div class="arrowDialogBox-container"> <div class="arrowDialo

關於VC彈出選擇資料夾對話方塊

VC程式設計中經常需要彈出選擇資料夾對話方塊供使用者選擇目標資料夾 基本實現的原始碼如下: 1 void CTestDlg::OnBtnTest() 2 { 3 // TODO: Add your control notification handler code here 4

react native學習筆記24——Modal實現自定義彈出對話方塊

前言 上一篇文章介紹React Native系統提供的兩個彈出框的api——Alert與AlertIOS,Alert可以在雙平臺通用,但是隻能展示資訊量有限功能單一的文字對話方塊。AlertIOS比Alert稍微豐富一點,可以展示供使用者輸入的對話方塊,但只能

MFC實現選擇資料夾的對話方塊

由於MFC自帶的CFileDiag是隻能選擇檔案的,無法定製只能選擇資料夾的對話方塊。然後當你僅僅需要操作資料夾,批量操作檔案時,你需要用WIN32API實現,以下貼出製做該對話方塊的函式。 void CQQICKView::OnMmm(){ // TODO:

Android如何實現對系統自帶對話方塊標題欄進行修改

先上一張圖可以看到,對話方塊的標題顏色是藍色的,下面還有一根線也是藍色的,在某些情況下,我們想改變程式的主題風格,顏色必須做修改,但又懶得去定製Dialog,下面的方法就誕生了: public static final void dialogTitleLineColor(

VC中開啟瀏覽資料夾對話方塊

TCHAR szPathName[MAX_PATH];CString str = L"";CString strDir = L"";//選擇的目錄TCHAR szTitle[] = _T("選擇清除路徑");memset(&bi,0,sizeof(BROWSEINFO));memset(szPath

VC MFC開發】Dll 中對話方塊的控制元件無法接受到按鍵訊息的解決辦法

使用DLL注入到 別的程式中時,發現DLL的視窗過程無法響應WM_CHAR事件,摸索了很久,才找到原因,給碰到同樣問題的人蔘考。 WNDPROC OldComboEditProc = NULL; LRESULT CALLBACK ComboEditProc(   HW

Delphi中實現可以更改大小的對話方塊

關鍵字:Dialog、對話方塊、resizable 1、問題的提出問題來自Stanley_Xu,希望得到只有關閉按鈕(還可以有幫助),左上也沒有程式的圖示並且能夠更改視窗大小的對話方塊。VCL中為TForm設定了BorderStyle和BorderIcons屬性,用以簡化視窗

Android透明圓形進度條對話方塊的設定

首先我們看一下Android自帶的圓形進度對話方塊: 接下來我們講一下如何建立: 1、使用Eclipse建立一個新的Andr​​oid 專案,使用Android 2.2或以上。 2、在/res/layout資料夾,建立線性佈局activity_main

C語言 貪吃蛇實現(不

  不費話,直接上程式碼。VC++ 6.0可以完美執行,VS2015等版本需要做點修改,請按提示將“scanf”這些函式改成“_scanf”這樣的形式即可。   不閃屏的原理部分請參考這篇文章   程式碼只有兩百多行,很多地方都加上了註釋,有疑問可以

jQuery+bootstrap實現美化警告/確認/提示對話方塊外掛

jconfirm.defaults = { title:'提示資訊', theme:'bootstrap', //icon:'fa fa-warning', type:'b

通過純JS和css實現自定義彈出對話方塊

需求: 實現通過一個彈出對話方塊來選擇下拉列表中對應值進行引數設定操作,及彈出對話方塊中需要有一個下拉列表輸入和一個確定按鈕即可,要求彈出對話方塊後,背部介面不能夠操作或者被遮蔽灰掉。 思路: 1.開始以為so so much simple,毫不猶豫考慮prompt彈出對話

QML實現可定製模態對話方塊【核心部分詳解】

轉自 http://blog.csdn.net/r5014/article/details/70139689  

VC對話方塊效果實現

#include "stdafx.h" #include "dib256.h" #include "dibpal.h" #define PADWIDTH(x) (((x)*8 + 31) & (~31))/8 CDIBitmap :: CDIBitmap() : m_pInfo(0) ,

VC 隱藏工作列,實現對話方塊的全顯示

這裡我選用實現對話方塊的全屏的方案是: 1 隱藏工作列 2 將對話方塊最大化顯示並且去掉標題欄 一  單獨隱藏工作列,很容易實現 缺陷:隱藏後任務欄所佔據的空間還是沒有騰出來 程式碼如下:HWND hWnd;hWnd = FindWindow("Shell_TrayWnd"

VC對話方塊如何新增WM_ERASEBKGND訊息(OnEraseBkgnd函式)及對話方塊使用點陣背景並透明

1、使用OnEraseBkgnd函式實現對話方塊點陣圖背景 BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC   *pDC)   //老婆:增加擦出背景函式{ CRect rect; GetClientRect(&rect);  CBitmap m_p

VC對話方塊使用OnEraseBkgnd函式點陣背景並透明

1、使用OnEraseBkgnd函式實現對話方塊點陣圖背景 BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC   *pDC)   //增加擦除背景函式 {  CRect rect;  GetClientRect(&re