Active Basic再描写処理で棒人間を動かすと爆弾がちらつく問題の解決方法は?

このQ&Aのポイント
  • 最近デバイスコンテキストを何とか理解してきたので、実験的に『上から物体が振ってくるのを避ける』というゲームを作ってみようと思い作り始めました。
  • 棒人間を動かすと、どうしても●がちらつきます。この場合は、どういう風に処理をすればいいのでしょうか?プログラムはこう書きました。
  • InvalidateRect関数の二つ目のパラメータは、クライアント領域全体を再描写させるために指定されますが、なぜ『Byval 0』と表記するのでしょうか?
回答を見る
  • ベストアンサー

Active Basic 再描写処理

最近デバイスコンテキストを何とか理解してきたので、実験的に『上から物体が振ってくるのを避ける』というゲームを作ってみようと思い作り始めました。 『←』が押されれば、棒人間を左に、『→』が押されれば、棒人間を右に移動させる処理と、ランダムで●が上から落ちてくるという処理をタイマーを使ってやってみました。(スレッドとかはまだ勉強していないので) 一応完成はしたのですが、棒人間を動かすと、どうしても●がちらつきます。 この場合は、どういう風に処理をすればいいのでしょうか? プログラムはこう書きました。 グローバル変数 Dim hBmp01 As HWND Dim hBmp02 As HWND Dim hBmp03 As HWND Dim hBmp04 As HWND Dim hMemDC As HDC Dim BmpInfo As Long Dim hBomDC As HWND Dim Bomxy As RECT Dim x As Long Dim y As Long Dim bx As Long Dim by As Long Dim n As Long '---------------------------------------------------- 省略 '----------------------------------------------------- Sub MainWnd_Destroy() DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) YokeGame_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) SetWindowText(hMainWnd,"画像描写テスト ~爆弾的なものを避けるゲーム~") hBmp01 = LoadImage(0,".\画像\人\普通.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp02 = LoadImage(0,".\画像\人\右.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp03 = LoadImage(0,".\画像\人\左.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp04 = LoadImage(0,".\画像\爆弾\ボム.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) GetWindowRect(hBmp04,Bomxy) If hBmp01=0 or hBmp02=0 or hBmp03=0 or hBmp04=0 Then MessageBox(hMainWnd,Ex"画像の読み込みに失敗しました\r\n強制終了します。","Error",MB_OK or MB_ICONHAND) DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) SendMessage(hMainWnd,WM_CLOSE,0,0) End If x=290 y=275 BmpInfo=1 bx = 320 by = 0 SetTimer(hMainWnd,0,300,0) End Sub Sub Kettei() Dim ok As Long by=0 Do Randomize bx = Fix(Rnd()*100) If bx>0 and 630>bx Then ok=TRUE End If Loop Until ok=TRUE End Sub Sub MainWnd_Paint(hDC As HDC) hMemDC = CreateCompatibleDC(hDC) hBomDC = CreateCompatibleDC(hDC) If BmpInfo = 1 Then SelectObject(hMemDC,hBmp01) Else If BmpInfo = 2 Then SelectObject(hMemDC,hBmp02) Else If BmpInfo = 3 Then SelectObject(hMemDC,hBmp03) End If BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hMemDC,hBmp01) BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hBomDC,hBmp04) BitBlt(hDC,bx,by,9,9,hBomDC,0,0,SRCCOPY) DeleteDC(hMemDC) DeleteDC(hBomDC) BmpInfo = 1 End Sub Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode = 37 Then If x<=0 Then x=0 Exit Sub End If x = x - 10 BmpInfo=3 End If If KeyCode = 39 Then If x>=600 Then x = 600 Exit Sub End If x = x + 10 BmpInfo=2 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub Sub MainWnd_Timer(TimerID As DWord) If TimerID = 0 Then by = by + 10 InvalidateRect(hMainWnd,Byval 0,TRUE) If by >=360 Then Kettei() End If End If End Sub っと、このようになりました。(一応動きます) strictには、チェックを入れていません。 バージョンは、4.23.00を使っています。 それと、InvalidateRect関数なのですが、 InvalidateRect(hMainWnd,Byval 0,TRUE) の、二つ目のパラメータ(?)部分に、全体を再描写させるときに何故『Byval 0』と表記するのでしょうか? ヘルプには、NULL を指定すると、クライアント領域全体が更新領域に設定されますと書かれていますが、NULLを指定すると無効な識別となります。 すみませんが、分かる方がいらっしゃいましたら、ご教授をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんにちは。  チラつくのは、BitBltの後にSleepを過剰に呼び出してしまっているからでしょう。  キー入力の方向に対応した人間をBitBltした後、爆弾をBitBltしてから、Sleepをかければ良いでしょう。  また、デバイスコンテキストは、可能な限り直に開放した方が良いです。  後、細かい事に言及すると、MainWnd_KeyUpイベントを処理してその中で、←か→のボタンが離されたら、BmpInfo=1として人間を普通の向きにしてあげると良いと思います。  「ByVal 0」に関しては、本来その部分にはRECT*と言うポインタが入ります。NULLを指定すると全体を再描画出来ます。  「NULLについて」  http://www.valley.ne.jp/~ryouga/machine/tips/c005.html  まぁ、要は「0」の事です。  「ByVal 0」と書く理由に関しては(しかし、0である事位は容易に想像出来る)、当方もActiveBasicの事をもっと勉強してみないと名言は出来ません。  で、肝心なチラつき対策の方ですが、実際にActiveBasic5で試して見ました。以下参考程度に。 '再描画イベント(チラつき修正) Sub MainWnd_Paint(hDC As HDC) hMemDC = CreateCompatibleDC(hDC) hBomDC = CreateCompatibleDC(hDC) 'キーに対応した方向の人間の絵を選択 If BmpInfo = 1 Then SelectObject(hMemDC,hBmp01) Else If BmpInfo = 2 Then SelectObject(hMemDC,hBmp02) Else If BmpInfo = 3 Then SelectObject(hMemDC,hBmp03) End If '人間を描く BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) 'ボムの絵を選択 SelectObject(hBomDC,hBmp04) 'ボムの絵を描く BitBlt(hDC,bx,by,9,9,hBomDC,0,0,SRCCOPY) '先にデバイスコンテキストを開放した方がよい DeleteDC(hMemDC) DeleteDC(hBomDC) 'ココで休む Sleep(30) End Sub 'キーが離された時(追加) Sub MainWnd_KeyUp(KeyCode As Long, flags As Long) '←又は→が離された If KeyCode = 37 or KeyCode = 39 Then '普通の向きにしてから再描画する BmpInfo=1 InvalidateRect(hMainWnd,ByVal 0,TRUE) End If End Sub

if-so-at
質問者

お礼

なるほど・・・ DCは早めに開放しなければいけなかったのですか・・・ 勉強になりました! スリープの数ですね?早速試してみます。 ありがとうございました

関連するQ&A

  • ActiveBasic 再描写処理が読み出されても、描写していた物を削除しない方法

    ActiveBasic4.23.00を使ってプログラムを書いています。 例えば、次のようなコードがあったとします。 'グローバル Dim DragFlag As Long Dim hDC As HDC '此処まで Sub MainWnd_Destroy() ReleaseDC(hMainWnd,hDC) test_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) hDC = GetDC(hMainWnd) End Sub Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer) DragFlag = 1 MoveToEx(hDC,x,y,ByVal NULL) End Sub Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer) If DragFlag = 0 Then Exit Sub LineTo(hDC,x,y) End Sub Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer) DragFlag = 0 End Sub (ABWiki様を参考にさせていただきました。) これで、簡単なお絵かきが出来ますが、再描写(例えば、ウインドウの大きさを変えるなど)をするとすべて消えてしまいます。 これを、描いた線を消さずに再描写することは出来ないのでしょうか。 すみませんがご教授ください。

  • Active Basic 画像の透過処理

    AB4.23.00を使っています。 簡単なゲームを作ろうと思って作成を進めているのですが、 画像を透過する処理でつまずいてしまいました。 Sub ShowPictures() /*ピクチャを描写する*/ Dim n As Long Dim hDC As HDC Dim hMyMaskDC As HDC '自機マスク用 Dim hMyMaskBmp As HBITMAP '自機マスク用 Dim hMyTempDC As DWord Dim hMyTempBmp As DWord hDC=GetDC(hMainWnd) '背景 BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) '敵画像 For n=0 to 100 Step 1 BitBlt(hMemDC,ex[n],ey[n],30,30,hEneDC[n],0,0,SRCCOPY) Next '自機描写 hMyMaskDC=CreateCompatibleDC(hDC) hMyMaskBmp=CreateBitmap(40,50,1,1,0) SelectObject(hMyMaskDC,hMyMaskBmp) BitBlt(hMyMaskDC,0,0,x,y,hMyDC,0,0,SRCCOPY) hMyTempDC=CreateCompatibleDC(hDC) hMyTempBmp=CreateCompatibleBitmap(hDC,40,50) SelectObject(hMyTempDC,hMyTempBmp) BitBlt(hMyTempDC,0,0,x,y,hMyMaskDC,0,0,NOTSRCCOPY) 'BitBlt(hMyTempDC,0,0,x,y,hMyDC,x,y,SRCAND) 'キャラクタ画像をOR転送 BitBlt(hMemDC,0,0,x,y,hMyTempDC,0,0,SRCPAINT) 'マスク画像をAND転送 BitBlt(hMemDC,0,0,x,y,hMyMaskDC,0,0,SRCAND) 'マスク用画像をメモリから解放 DeleteDC(hMyMaskDC) DeleteObject(hMyMaskBmp) 'キャラクタの一時画像をメモリから解放 DeleteDC(hMyTempDC) DeleteObject(hMyTempBmp) InvalidateRect(hMainWnd,ByVal 0,FALSE) DeleteObject(hMyMaskBmp) DeleteDC(hMyMaskDC) End Sub 描写処理のルーチンです。 これを実行すると、黒い塊になってしまいます。 どのように書けば、ちゃんと表示できるようになるのでしょうか。 すみませんが、ご教授をお願いします。

  • Active Basic 画像表示 添削願い

    AB4.23.00を使っています。 複数画像を表示しようと頑張っているのですが、どうやっても出来ません。 すみませんが、コードの添削の方をお願いします。 '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 /*全体*/ Dim hMemDC As HDC /*背景*/ Dim hBackDC As HDC Dim hBackBmp As HBITMAP /*自機*/ Dim hMyDC As HDC Dim hMyBmp As HBITMAP /*プログラムの設定など*/ Dim Dir As String '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() stg_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hDC As HDC Dim OldBmp As HBITMAP SetWindowText(hMainWnd,"しゅーてぃんぐ") 'ディレクトリ取得 Dim path[MAX_PATH+1] As Byte GetCurrentDirectory(MAX_PATH,path) Dir=path 'MainWndのDC取得 hDC=GetDC(hMainWnd) '全体DCメモリ作成 hMemDC=CreateCompatibleDC(hDC) '背景 hBackBmp=LoadImage(0,back.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hBackDC=CreateCompatibleDC(hDC) 'キャラクター hMyBmp=LoadImage(0,A.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hMyDC=CreateCompatibleDC(hBackDC) '描写 SelectObject(hMemDC,hBackBmp) BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) SelectObject(hMemDC,hMyBmp) BitBlt(hMemDC,0,0,40,50,hMyDC,0,0,SRCCOPY) ReleaseDC(hMainWnd,hDC) End Sub Sub MainWnd_Paint(hDC As HDC) BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY) End Sub back.bmpの上にA.bmpを描写したいです。 透過処理などはいらないので、どうすれば表示することが出来るかを教えてください。 今は、どちらか片一方しか表示されません。 また、 http://www.geocities.jp/debu0510/basic/main17.html を参考にさせていただいたのですが、CreateCompatibleBitmap関数の使い方が分かりません。 これは、どのようにして使用するのでしょうか。 こちらもご教授お願いします。

  • [Active Basic]BitBltで画像を表示

    ActiveBasicでプログラムを書いています。 少しずつデバイスコンテキストが使えるようになってきて、簡単なブロック崩しを作ってみようと思い、作り始めました。 以前、デバイスコンテキストを使えるようになろうと、上から物体が降ってきて、それを避けるというゲームを書いてみたのですが、画像(ビットマップ)の表示方法が分からず、すべて MainWnd_Paint(hDC As HDC) に中に書きました。 すると、処理ごとにいらないものまで描写されるので画面がかなりちらついてしまいました。 ActiveBasicのヘルプ(http://www.activebasic.com/help_center/articles/win32/step16/index.html)を参考にして、プログラムを書いてみたのですが、背景が描写されません。 コードを下に書きますので、すみませんが添削の方をお願いします。 まだ、プログラムを始めたばかりのほやほやですので、なるべくやさしくお願いします。 '------------グローバル------------ Dim ImgBack As HBITMAP '背景画像 Dim hBackDC As HDC '背景画像用デバイスコンテキスト Dim hMemDC As HDC 'BitBlt用のデバイスコンテキスト '------------グローバル------------ Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hDC As HDC 'イメージを読み込んでいく ImgBack = LoadImage(0,".\pic\back.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) 'デバイスコンテキストをそれぞれ作成 hDC = GetDC(hMainWnd) hBackDC = CreateCompatibleDC(hDC)'背景用DC hMemDC = CreateCompatibleDC(hDC)'BitBlt用DC '背景を描写 SelectObject(hBackDC,ImgBack) BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) '最後にhDCだけ開放 ReleaseDC(hMainWnd,hDC) End Sub Sub MainWnd_Paint(hDC As HDC) End Sub 後、BitBltを MainWnd_Paint(hDC As HDC) の中に表記すると、画像が表示されます。 何故か、いまいち分かっていません・・・ すみませんが、ご教授ください。

  • ActiveBasic 複数の画像表示をしたい

    ActiveBasic4.23.00を使っています。 簡単なゲームを作りたいのですが、なかなか画像の描写が出来ません。 すみませんが、以下のコードの添削をしていただけないでしょうか。 出来れば、詳しいやり方がほしいです。 (まだ、途中なので、DCの開放などはかいていない部分があります) 'デバイスコンテキスト Dim hMemDC As HDC Dim hBackDC As HDC Dim hMyDC As HDC 'ビットマップ Dim hBackBmp As HANDLE Dim hMyBmp As HANDLE Dim hMemBmp As HANDLE 'ハンドル Dim hBackHand As HANDLE Dim hMyHand As HANDLE 'プログラムの変数 Dim WhereDir As String '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() DeleteDC(hMemDC) DeleteDC(hMyDC) Game_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) /* 作成時 */ '自分自身のファイルパスを取得 Dim dir[MAX_PATH+1] As Byte GetCurrentDirectory(MAX_PATH,dir) WhereDir=dir 'メモリデバイスコンテキストを準備 Dim img As HDC img=GetDC(hMainWnd) hMemDC=CreateCompatibleDC(img) hBackDC=CreateCompatibleDC(img) hMyDC=CreateCompatibleDC(img) '画像をよみこむ hBackBmp=LoadImage(0,WhereDir+"\背景.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hMyBmp=LoadImage(0,WhereDir+"\人.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) '画像処理 hMemBmp=CreateCompatibleBitmap(img,640,480) hBackHand=CreateCompatibleBitmap(img,640,480) hMyHand=CreateCompatibleBitmap(img,40,50) SelectObject(hBackDC,hBackBmp) BitBlt(hMemDC,0,0,40,50,hBackDC,0,0,SRCCOPY) SelectObject(hMyDC,hMyBmp) BitBlt(hMemDC,0,0,40,50,hMyDC,0,0,SRCCOPY) SelectObject(hMemDC,hMemBmp) ReleaseDC(hMainWnd,img) End Sub Sub MainWnd_Paint(hDC As HDC) BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY) End Sub わかりにくいとは思いますが、お願いします。

  • Active Basic 枠無しウインドウをマウスで移動させる

    枠なしのウインドウ(スタイル:ポップアップ/枠無し)を、 ドラッグで任意の場所に移動させたいのですが、知識が足りません。 一応抵抗はしてみたのですが、あっけなく弾き飛ばされました。 'グローバル Dim LClickFlag As Long Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer) LClickFlag=TRUE End Sub Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer) LClickFlag=FALSE End Sub Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer) If LClickFlag=TRUE Then SetWindowPos(hMainWnd,NULL,x,y,0,0,SWP_NOSIZE) End If End Sub 動きはしますが、ちょこちょこちょこちょこ動いて、移動させたい場所に移動できません。 すみませんが、どのようにやれば良いかのご教授をお願いします。 それと、ずっと参考にしていた、Active Basicの非公式WIKI様(http://www.2chab.net/pukiwiki/index.php?ActiveBasic%20Wiki-TopPage)は、もう復活しないのでしょうか。 こちらも知っていらっしゃる方がいらっしゃいましたら、ご教授をお願いします。

  • ボタンが押されたときの反応 Basic

    Active Basicでゲームプログラムを書いています。 ボタンを押したときの反応で、上下左右に画像を動かしたいのですが、 ボタンを押すと、いったん静止してから、連打処理(?)のように動きます。 やりたいことは、ボタンを押すとすぐに上下左右に一定間隔で画像を動かすことです。 Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode=37 Then If x<=3 Then Exit Sub End If MyBmpInfo=2 x=x-5 Else If KeyCode=38 Then If y<=0 Then Exit Sub End If MyBmpInfo=1 y=y-5 Else If KeyCode=39 Then If x>=600 Then Exit Sub End If MyBmpInfo=3 x=x+5 Else If KeyCode=40 Then If y>=400 Then Exit Sub End If y=y+5 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub と書きました。 すみませんが、どなたかご存知の方がいらっしゃいましたら、ご教授ください。 お願いします。

  • ActiveBasic 音楽のループ再生

    Active Basic4.23.00でプログラムを書いています。 音楽再生ソフトを作ってみようと思い、作り始めたのですが、なかなかループ再生が出来ません。 チェックボックス1がチェックされていると、ループさせようと思っています。 ↓問題のコード Sub MainWnd_MciNotify(flags As Long, DevID As DWord) If SendMessage(GetDlgItem(hMainWnd,CheckBox1),BM_GETCHECK,0,0)=BST_CHECKED Then Dim bErr As Long Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd mpp.dwFrom=0 bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY or MCI_FROM,mpp) If bErr Then MessageBox(hMainWnd,"デバイス再生エラー","Error",MB_OK or MB_ICONHAND) Exit Sub End If Else mpp.dwCallback=hMainWnd mpp.dwFrom=0 End If End Sub 一見、(少なくとも自分は)成功しているように見えるのですが、 2回ループした後、フリーズしてしまいます。 すみませんが、何故そうなるかが分かる方がいらっしゃいましたら、すみませんが、ご教授ください。 お願いします。

  • Active Basic 自動でマスク画像を制作して、画像を透過する方法

    ABの4.23.00を使用しています 今回、マスク画像を自動的に作成して、ビットマップ画像を透過して表示させる方法を考えているのですが、なかなかうまくいきません。 皆さんの知識をお貸しください。 とりあえず、グローバルで変数を用意しました。 Dim hMemDC As HDC Dim hMemBmp As HBITMAP Dim hIconDC As HDC Dim hIconBmp As HBITMAP BITMAPリソースに適当な画像を入れて、クリエイトイベントで変数に読み込みました。 ※ビットマップの大きさは、32*32の物を使用してみました。 Dim hDC As HDC hDC=GetDC(hMainWnd) hIconDC=CreateCompatibleDC(hDC) hMemDC=CreateCompatibleDC(hDC) hIconBmp=LoadBitmap(GetModuleHandle(0),IDB_BITMAP1) hMemBmp=CreateCompatibleBitmap(hDC,300,300) SelectObject(hIconDC,hIconBmp) SelectObject(hMemDC,hMemBmp) 背景の色を指定しました SetBkColor(hIconDC,GetPixel(hIconDC,0,0)) とりあえず、hMemDCに画像をコピーしました。 BitBlt(hMemDC,0,0,32,32,hIconDC,0,0,SRCCOPY) ReleaseDC(hMainWnd,hDC) 次に、再描写の処理のときに、マスク画像を用意する処理を入れてみたのですが、うまくいきません。 Dim hMaskDC As HDC Dim hMaskBmp As HBITMAP Dim hTempDC As HDC Dim hTempBmp As HBITMAP hMaskDC=CreateCompatibleDC(hMemDC) hMaskBmp=CreateBitmap(32,32,1,1,0) SelectObject(hMaskDC,hMaskBmp) BitBlt(hMaskDC,0,0,32,32,hIconDC,0,0,SRCCOPY) hTempDC=CreateCompatibleDC(hDC) hTempBmp=CreateCompatibleBitmap(hMemBmp,32,32) SelectObject(hTempDC,hTempBmp) BitBlt(hTempDC,0,0,32,32,hMaskDC,0,0,NOTSRCCOPY) BitBlt(hTempDC,0,0,32,32,hIconDC,0,0,SRCAND) BitBlt(hMemDC,0,0,32,32,hMaskDC,0,0,SRCAND) BitBlt(hMemDC,0,0,32,32,hTempDC,0,0,SRCPAINT) DeleteDC(hMaskDC) DeleteObject(hMaskBmp) DeleteDC(hTempDC) DeleteObject(hTempBmp) BitBlt(hDC,0,0,32,32,hMemDC,0,0,SRCCOPY) このような感じで書いてみました すみませんが、添削をお願いします

  • Active Basicで、バツボタンを押したときの処理

    Active Basicでプログラムを書いていて、『×』ボタンを押すと、終了の確認のメッセージを出して、『はい』なら終了、『いいえ』ならプログラムの継続といったものを作りたいのですが、出来ません。 Sub MainWnd_QueryClose(ByRef cancel As Integer) If MessageBox(hMainWnd,"終了しますか?","確認",MB_YESNO or MB_ICONINFORMATION) = IDNO Then Exit Sub End If End Sub 今回使ったコードです。 すみませんが、何処を修正すれば良いかご存知の方、ご教授ください。

専門家に質問してみよう