ShowWindow(hWnd, SW_SHOWMAXIMIZED);
で全画面になると思っていたけど、そうならなかった。
画面上部のタイトルバーと、下部のメニューバーは表示されてしまう。
メニューバーの表示を消すのにメニューの登録コードを全部削ったらメニューの表示はされなくなった。でもたまにSIPの選択部分だけ表示されたりする
あと、メニューがないのでソフトキーの受け取り方も分からない....
ShowWindow(hWnd, SW_SHOWMAXIMIZED);
#define VK_RETURN 0x0D
#define VK_LEFT 0x25
#define VK_UP 0x26
#define VK_RIGHT 0x27
#define VK_DOWN 0x28
#define VK_PROCESSKEY 0xE5
HANDLE LoaderHandle = CreateThread(NULL,0,LoaderThreead,0,0,(LPDWORD)&ThreadID);
m_LoadRequest = CreateEvent(NULL, FALSE, FALSE, TEXT("LOADREQUEST"));
CloseHandle(m_LoadRequest);
WaitForSingleObject(m_LoadRequest,INFINITE);
SetEvent(m_LoadRequest);
bool m_threadEnd;
HANDLE m_RenderHandle;
HANDLE m_LoaderHandle;
HANDLE m_UpdateEvent;
HANDLE m_LoadCmplete;
HANDLE m_LoadRequest;
void OnCreate(HWND hWnd)
{
WORD ThreadID;
gFrame = 0;
gNextFrame = 0;
pictnow = NULL;
pictload = NULL;
m_LoadRequest = CreateEvent(NULL, FALSE, FALSE, TEXT("LOADREQUEST")); // 自動リセット reset状態
m_LoadCmplete = CreateEvent(NULL, FALSE, FALSE, TEXT("LOADEREVENT")); // 自動リセット reset状態
m_UpdateEvent = CreateEvent(NULL, FALSE, TRUE , TEXT("UPDATEEVENT")); // 自動リセット
m_LoaderHandle = CreateThread(NULL,0,LoaderThreead,0,0,(LPDWORD)&ThreadID);
m_RenderHandle = CreateThread(NULL,0,RenderThreead,0,0,(LPDWORD)&ThreadID);
SetThreadPriority(m_RenderHandle,THREAD_PRIORITY_TIME_CRITICAL);
}
void OnDestroy(HWND hWnd)
{
m_threadEnd = TRUE;
// 停止中のスレッドに終了を伝える為にeventをセットする
SetEvent(m_UpdateEvent);
SetEvent(m_LoadRequest);
// ローダースレッドが処理を完了するまで待つ
WaitForSingleObject(m_LoadCmplete,INFINITE);
CloseHandle(m_LoadCmplete);
CloseHandle(m_LoaderHandle);
CloseHandle(m_RenderHandle);
CloseHandle(m_UpdateEvent);
CloseHandle(m_LoadRequest);
}
DWORD WINAPI RenderThreead(LPVOID lpParameter)
{
int frame = -1;
int render_frame = -1;
while(m_threadEnd!=TRUE)
{
// 描画するフレームを決定
if(frame<gFrame)
{
// フレーム更新
frame = gFrame;
}
else
{
// 更新前だが次のフレームを用意しておく
frame = gFrame +1;
}
if(frame>render_frame)
{
render_frame = frame;
if((pictnow==NULL)||(pictnow->IsEnd(frame)))
{
SetThreadPriority(m_LoaderHandle,THREAD_PRIORITY_ABOVE_NORMAL);
WaitForSingleObject(m_LoadCmplete,INFINITE);
if(pictnow)
delete pictnow;
if(pictload==NULL)
break;
pictnow = pictload;
pictload = NULL;
// ローダーを再開する(再開前にスレッドの優先度を下げておく)
SetThreadPriority(m_LoaderHandle,THREAD_PRIORITY_IDLE);
SetEvent(m_LoadRequest);
}
pictnow->Draw(pScreen->m_Buf,pScreen->m_dspW,pScreen->m_dspH,render_frame);
}
else
{
WaitForSingleObject(m_UpdateEvent,INFINITE);
}
}
return 0;
}
DWORD WINAPI LoaderThreead(LPVOID lpParameter)
{
while(m_threadEnd!=TRUE)
{
// 写真のファイル名を取得
TCHAR *fname = FindFile();
if(fname ==NULL)
{
// 取得できなかった
// SendMessage();
pictload = NULL;
break;
}
// ファイルを読み込む
pictload = new CPicture();
if(!pictload->LoadPicture(fname,gNextFrame))
{
// ファイルが読めなかった
continue;
}
// 次のファイルの開始フレームを決定
gNextFrame = pictload->frame_end;
// RenderThread にロード完了したことを伝える
SetEvent(m_LoadCmplete);
// さらに次のファイルを読み込みを開始できるまで待つ
WaitForSingleObject(m_LoadRequest,INFINITE);
}
// スレッド終了待ちを解除するため
SetEvent(m_LoadCmplete);
return 0;
}
class CScreen
{
public:
CScreen(void);
~CScreen(void);
HDC m_DC;
HBITMAP m_Bmp;
PBYTE m_Buf;
int m_dspW;
int m_dspH;
int m_WidthByte;
void Blt(HDC hdc, int w, int h);
};
CScreen::CScreen(void)
{
HDC dc = GetDC(NULL);
m_DC = CreateCompatibleDC(dc);
ReleaseDC(NULL,dc);
m_dspW = 480;
m_dspH = 640;
m_WidthByte = (m_dspW*2+1)&0xfffffffe;
m_Buf = (PBYTE) new WORD[m_WidthByte*m_dspH];
}
CScreen::~CScreen(void)
{
DeleteObject(m_DC);
delete [] m_Buf;
}
void CScreen::Blt(HDC hdc, int w, int h)
{
HGDIOBJ oldObj;
m_Bmp = CreateBitmap(m_dspW, m_dspH, 1, 16, m_Buf);
oldObj = SelectObject(m_DC, m_Bmp);
BitBlt(hdc,0,0,w,h,m_DC,0,0,SRCCOPY);
SelectObject(m_DC, oldObj);
DeleteObject(m_Bmp);
}
bool CPicture::Draw(HDC hdc, RECT rc, int frame)
{
int w = rc.right - rc.left;
int h = rc.bottom - rc.top;
// 表示用のバッファ領域を作成する
if(m_hBmp == NULL)
{
m_hBmp = CreateCompatibleBitmap(hdc,w,h);
m_WidthByte = (w*2+1)&0xfffffffe;
m_buf = (LPBYTE) new WORD[m_WidthByte*h];
}
// イメージ内の表示領域を取得する
KEY src = GetValue(frame);
int srcX = src.sx;
int srcY = src.sy;
int srceX = src.ex;
int srceY = src.ey;
int srcW = src.ex - src.sx;
int srcH = src.ey - src.sy;
int ddx,ddy;
int sy = srcY;
unsigned short rgb;
// 拡大縮小とフェードインアウト画像処理
WORD *dpx;
ddy = h;
for(int y=0;y<h;y++)
{
int sidx = (m_Height-sy)*m_Width + srcX;
dpx = (WORD*)(m_WidthByte*y + m_buf);
ddx = w;
ddy -= srcH;
while(ddy<=0)
{
sy += 1;
ddy+= h;
}
for(int x=0;x<w;x++)
{
if(sidx<m_Width*m_Height)
{
unsigned char r = (src_buf[sidx].rgbRed * src.fader)>>8;
unsigned char g = (src_buf[sidx].rgbGreen * src.fader)>>8;
unsigned char b = (src_buf[sidx].rgbBlue * src.fader)>>8;
rgb = ((r << 8) & 0xf800)
| ((g << 3) & 0x07e0)
| ((b >> 3) & 0x001f);
}
else
{
rgb = 0;
}
*dpx=rgb;
dpx++;
ddx -= srcW;
while(ddx<=0)
{
sidx+=1;
ddx += w;
}
}
}
// バッファのイメージをbitmapにコピーする
SetBitmapBits(m_hBmp,m_WidthByte*h,m_buf);
// ディスプレイにbitmapをコピーする
HDC hBmpDC = CreateCompatibleDC(hdc);
SelectObject(hBmpDC, m_hBmp);
BitBlt(hdc,0,0,w,h,hBmpDC,0,0,SRCCOPY);
DeleteObject(hBmpDC);
return true;
}
WINGDIAPI HBRUSH WINAPI CreatePatternBrush(HBITMAP);
WINGDIAPI HBITMAP WINAPI CreateBitmap(int,int,UINT,UINT,CONST VOID *);
WINGDIAPI HBITMAP WINAPI CreateCompatibleBitmap(HDC,int,int);
WINGDIAPI LONG WINAPI SetBitmapBits(HBITMAP,DWORD,CONST VOID*);
WINGDIAPI BOOL WINAPI MaskBlt(HDC,int,int,int,int,HDC,int,int,HBITMAP,int,int,DWORD);
WINGDIAPI HBITMAP WINAPI CreateDIBSection(HDC,CONST BITMAPINFO *,UINT,VOID **,HANDLE,DWORD);
WINGDIAPI int WINAPI GetDIBits(HDC, HBITMAP, UINT, UINT, LPVOID, LPBITMAPINFO, UINT);
WINGDIAPI LONG WINAPI GetBitmapBits(HBITMAP, LONG, LPVOID);
m_hBmp = SHLoadImageFile(fname);
BITMAP bmp;
GetObject(m_hBmp,sizeof(bmp),&bmp);
m_Width = bmp.bmWidth;
m_Height = bmp.bmHeight;
m_WidthByte = bmp.bmWidthBytes;
m_buf = (LPBYTE)(bmp.bmBits);