ユニークポインタを用いたWM_PAINT内部のメソッドを動作させようとすると止まってしまうという問題が生じたため、相談いたします。
問題というのは、WM_PAINT内部でユニークポインタによるメソッドを使用すると挙動が止まるというものです。
なお、今回作成したプログラムではほかにもWM_KEYDOWN、デッドタイムなどにも同じようにメソッドを用いているのですが、そちらは問題なく挙動しています。
そのため、メソッド内部の動作がおかしいのではないかと思い、メソッド内部の実行処理をなくしてみたのですが、それでも止まる状態にあります。
問題の洗い出しのためにデバッグを行った際には『例外がスローされました:読み取りアクセス違反。
this->process_current_level._Mypair._Myval2 が nullptr でした。』というエラーが帰ってきました。
しかし、nullptrであればほかの同クラスのメソッドでも止まるはずです。
いろいろ試してはみたのですが、自分ではもうわかりません。
なぜ、WM_PAINT内で呼び出したメソッドのみが止まるのでしょうか。
回答をよろしくお願いします。
*
下にコードを貼ります。
後、WM_PAINT内部に普通に実行内容を書いた場合には普通に動きます。
application_handler.h
#pragma once
#include "include.h"
#include "process.h"
class Application_Handler {
public:
Application_Handler(HWND hWnd) {
hwnd = hWnd;
}
~Application_Handler(void) {
}
void init(Process*);
void input(WPARAM wp);
void update();
void render();
private:
HWND hwnd;
int main_phase;
int chapter_phase;
unique_ptr<Process> process_current_level;
};
#include "application_handler.h"
void Application_Handler::init(Process* lev) {
process_current_level.reset(lev);
}
void Application_Handler::input(WPARAM wp) {
process_current_level->input(wp);
}
void Application_Handler::update() {
process_current_level->update();
}
void Application_Handler::render() {
process_current_level->render();
}
process.h
#pragma once
#include "include.h"
class Process {
public:
Process() {
}
virtual void input(WPARAM) = 0;
virtual void update() = 0;
virtual void render() = 0;
};
class Chapter1 : public Process {
public:
Chapter1(HWND hWnd) : Process() {
hwnd = hWnd;
x = 0;
flag = 1;
hBitmap = (HBITMAP)LoadImage(NULL, "aaa.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
GetObject(hBitmap, sizeof(BITMAP), &bmp);
}
void input(WPARAM) override;
void update() override;
void render() override;
private:
PAINTSTRUCT ps;
HWND hwnd;
int x;
bool flag;
HBITMAP hBitmap;
BITMAP bmp;
HDC main_hdc;
HDC map;
};
#include "process.h"
void Chapter1::input(WPARAM wp) {
switch (wp) {
case VK_A:
MessageBox(0,0,0,0);
break;
}
}
void Chapter1::update() {
if (flag == 1) {
x++;
if (x > 100) {
flag = !flag;
}
}
else {
x--;
if (x < -100) {
flag = !flag;
}
}
}
void Chapter1::render() {
}
#include "system.h"
Application_Handler* System::application_handler;
LRESULT _stdcall System::proc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param) {
HINSTANCE hinst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);//GetModuleHandle(NULL);
switch (msg) {
case WM_CREATE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
application_handler->input(w_param);
break;
case WM_PAINT:
application_handler->render();
break;
}
return DefWindowProc(hwnd, msg, w_param, l_param);
};
bool System::init_window() {
WNDCLASSEX Main_Win_Class = {
sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW ,proc,NULL,NULL,main_hinst,LoadIcon(NULL, IDI_APPLICATION),LoadCursor(NULL,IDC_ARROW),(HBRUSH)GetStockObject(BLACK_BRUSH),"TITLEMENU","MAIN"
};
if (!RegisterClassEx(&Main_Win_Class))
return false;
main_hwnd = CreateWindowEx(
WS_EX_WINDOWEDGE | WS_EX_OVERLAPPEDWINDOW | WS_EX_COMPOSITED, "MAIN", "fast break", WS_CAPTION | WS_VISIBLE | WS_OVERLAPPEDWINDOW ^ WS_SIZEBOX ^ WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, (rect.right - rect.left), (rect.bottom - rect.top), NULL, LoadMenu(main_hinst, "MAIN_MENU"), main_hinst, NULL
);
SetMenu(main_hwnd, NULL);
return true;
}
void System::run() {
application_handler->init(new Chapter1(main_hwnd));
while (main_msg.message != WM_QUIT) {
if (PeekMessage(&main_msg, NULL, NULL, NULL, PM_REMOVE)) {
DispatchMessage(&main_msg);
application_handler->update();
}
else {
fps_handler->Fps_Handle_Control(main_hwnd);
}
}
delete application_handler;
}