获取HINSTANCE


获取 HWND 用API GetConsoleWindow,获取 HINSTANCE 使用GetModuleHandle(NULL)。
比如说:
 
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include <map>
 
using   namespace   std;
 
namespace   dbsoft
{
class   CSplashWindow
{
public :
CSplashWindow( HINSTANCE   hInst, std::basic_string< TCHAR > strBmp ):m_hInstance(hInst),m_hWnd(NULL),m_hBitMap(NULL),m_hThread(NULL), \
m_strBmpFile( strBmp )
{
}
 
    ~CSplashWindow()
{
Stop();
}
 
    inline   bool   Show()
{
TCHAR   szClassName[MAX_PATH];
_stprintf_s( szClassName, _T( "SplashScreenClass%d" ), ( int ) this   );
m_strClassName = szClassName;
 
     WNDCLASS wc;
wc.style       = 0;
wc.lpfnWndProc = (WNDPROC) SplashScreenWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance   = m_hInstance;
wc.hIcon       = LoadIcon(( HINSTANCE ) NULL, IDI_APPLICATION);
wc.hCursor     = LoadCursor(( HINSTANCE ) NULL, IDC_ARROW);
wc.hbrBackground = ( HBRUSH )GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
 
     if (!RegisterClass(&wc))
{
return   0;
}
 
     m_hBitMap = ( HBITMAP ) LoadImage( m_hInstance, m_strBmpFile.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 
     if ( m_hBitMap == NULL )
{
return   false ;
}
 
     m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SplashScreenWorkThread, this , 0, NULL);
 
     return   true ;
}
 
    inline   void   Stop()
{
if (m_hThread)
{
if (m_hWnd)
{
PostMessage(m_hWnd, WM_DESTROY, 0, 0);
}
 
      WaitForSingleObject(m_hThread, INFINITE);
 
      unRegisterWindow( this   );
 
      CloseHandle(m_hThread);
m_hThread = NULL;
m_hWnd = NULL;
}
}
 
    inline   HINSTANCE           GetIns() const
{
return   m_hInstance;
}
 
    inline   HBITMAP             GetBitmap() const
{
return   m_hBitMap;
}
 
    inline   HWND                GetWnd() const
{
return   m_hWnd;
}
 
    inline   void                SetWnd( HWND   hWnd )
{
m_hWnd = hWnd;
}
 
    inline   std::basic_string< TCHAR > GetClassName() const
{
return   m_strClassName;
}
 
private :
HINSTANCE                   m_hInstance;
HWND                        m_hWnd;
HANDLE                      m_hThread;
std::basic_string< TCHAR > m_strBmpFile;
std::basic_string< TCHAR > m_strClassName;
HBITMAP                     m_hBitMap;
 
 
static   inline   std::map< HWND , CSplashWindow*>& StaticMapContainer()
{
static   std::map< HWND ,CSplashWindow*> container;
 
     return   container;
}
 
    inline   static   void   registerWindow( CSplashWindow* hWnd )
{
if ( hWnd != NULL )
{
StaticMapContainer()[ hWnd->GetWnd() ] = hWnd;
}
 
    inline   static   void   unRegisterWindow( CSplashWindow* hWnd )
{
if ( hWnd != NULL )
{
StaticMapContainer().erase( hWnd->GetWnd() );
}
}
 
 
static   DWORD   WINAPI SplashScreenWorkThread( LPVOID   lpParam )
{
CSplashWindow* Win = (CSplashWindow*)lpParam;
 
     if ( Win == NULL || Win->GetIns() == NULL || Win->GetBitmap() == NULL )
{
MessageBox( NULL, _T( "Error, Can't Create SplashWindow" ), _T( "Error" ), 0 );
return   0;
 
     BITMAP bm;
GetObject( Win->GetBitmap(), sizeof (bm), &bm);
INT   ScreenPosX = (GetSystemMetrics(SM_CXSCREEN) - bm.bmWidth) / 2;
INT   ScreenPosY = (GetSystemMetrics(SM_CYSCREEN) - bm.bmHeight) / 2;
 
     HWND   hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, Win->GetClassName().c_str(), TEXT( "SplashWindow" ), WS_BORDER|WS_POPUP,
ScreenPosX, ScreenPosY, bm.bmWidth, bm.bmHeight, ( HWND ) NULL, ( HMENU ) NULL, Win->GetIns(), ( LPVOID ) NULL);
 
     Win->SetWnd( hWnd );
 
     registerWindow( Win );
 
     if   (hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
 
      MSG message;
while   (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
 
     return   0;
}
 
    static   LRESULT   CALLBACK SplashScreenWndProc( HWND   hWnd, UINT   message, WPARAM   wParam, LPARAM   lParam)
{
HDC   hdc;
PAINTSTRUCT ps;
 
     switch ( message )
{
case   WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
 
      {
try
{
CSplashWindow* hWindows = StaticMapContainer()[hWnd];
 
        if ( hWindows )
{
DrawState(hdc, DSS_NORMAL, NULL, ( LPARAM )hWindows->GetBitmap(), 0, 0, 0, 0, 0, DST_BITMAP);
}    
}
catch (...)
{
}   
}
 
      EndPaint(hWnd, &ps);
break ;
case   WM_DESTROY:
PostQuitMessage(0);
break ;
default :
return   DefWindowProc(hWnd, message, wParam, lParam);
}
 
     return   0;
}
};
}
 
int   main()
{
HINSTANCE   hInstance = GetModuleHandle(NULL);
 
dbsoft::CSplashWindow splash( hInstance, _T( "test.bmp" ) );
 
splash.Show();
 
::Sleep( 3000 );
 
splash.Stop();
 
return   0;
}
 
 
      不要打算用GetWindowLong加参数GWL_HINSTANCE从 HWND 得到 HINSTANCE ,我试过了,不行。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM