前提・実現したいこと
以前質問したteratail:WinAPI マルチスレッドにおける子ウィンドウの作成の未解決シンボルエラーの原因は定義されたファイルの未インクルードであったと思ったのですが少し改修しましたが複数定義のエラーが消えません.どのように記述すればいいのでしょうか?
また以前聞かれましたマルチスレッドにおける子ウィンドウ作成の目的はメインウィンドウの処理軽減です.常時ではなく必要なときのみ子ウィンドウを作成しそこに自作のプログレスバーを表示させ処理が済めばプログレスバーを子ウィンドウのスレッド諸共削除しようと考えたためです.常時何も描かない子ウィンドウを用意してもこの程度なら処理が特別重くなるものではないとは思いますが学習目的です.
発生している問題・エラーメッセージ
LINK2005 cWindowProcは既にdefthread.objで定義 LINK2005 cwthreadは既にdefthread.objで定義 LINK1169 1つ以上の複数定義シンボルが存在
###コード概要(前回同様)
スレッドへ渡すデータはPassHandleで親のHWNDとHINSTANCE
親ウィンドウプロシージャWM_CREATEで子ウィンドウ作成のスレッド作成
そのスレッドでWNDCLASSEX登録,ウィンドウ作成,子ウィンドウのプロシージャ作成
該当のソースコード
C
1//main.cpp 2#define UNICODE 3 4#include <windows.h> 5#include <process.h> 6#include "defstructure.cpp" 7#include "defthread.cpp" 8 9LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 10 11const wchar_t CLASS_NAME[] = L"CLASS"; 12 13HINSTANCE hInst; 14 15int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR nCmdLine, int nCmdShow) { 16 UNREFERENCED_PARAMETER(hPrevInstance); 17 UNREFERENCED_PARAMETER(nCmdLine); 18 19 hInst = hInstance; 20 21 WNDCLASSEX wc = { 22 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, WindowProc, 23 0, 0, hInstance, 24 NULL, NULL,(HBRUSH)GetStockObject(WHITE_BRUSH), 25 NULL, CLASS_NAME, NULL 26 }; 27 28 RegisterClassEx(&wc); 29 30 HWND hwnd = CreateWindowEx( 31 0, CLASS_NAME, L"Template", WS_OVERLAPPEDWINDOW, 32 50, 50, 960, 525, 33 NULL, NULL, hInstance, NULL 34 ); 35 36 ShowWindow(hwnd, nCmdShow); 37 UpdateWindow(hwnd); 38 39 MSG msg = {}; 40 41 while (GetMessage(&msg, NULL, 0, 0)) { 42 TranslateMessage(&msg); 43 DispatchMessage(&msg); 44 } 45 46 return (int)msg.wParam; 47} 48 49LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 50 switch (uMsg) { 51 case WM_CREATE: 52 53 static PassHandle *mph; 54 mph->hwnd = hwnd; 55 mph->hInst = hInst; 56 57 _beginthreadex(NULL, 0, (_beginthreadex_proc_type)cwthread, mph, 0, NULL); 58 break; 59 60 case WM_PAINT: 61 { 62 PAINTSTRUCT ps = {}; 63 HDC hdc = GetDC(hwnd); 64 65 BeginPaint(hwnd, &ps); 66 FillRect(hdc, &ps.rcPaint, (HBRUSH)GetStockObject(BLACK_BRUSH)); 67 EndPaint(hwnd, &ps); 68 } 69 break; 70 71 case WM_DESTROY: 72 PostQuitMessage(0); 73 return 0; 74 } 75 76 return DefWindowProc(hwnd, uMsg, wParam, lParam); 77}
C
1//defstructure.cpp 2#pragma once 3 4#include <windows.h> 5 6struct PassHandle { 7 HWND hwnd; 8 HINSTANCE hInst; 9}; 10 11const wchar_t CHILD_CLASS_NAME[] = L"Child Class Name";
C
1//defthread.cpp 2#pragma once 3 4#ifndef UNICODE 5#define UNICODE 6#endif 7 8#include <windows.h> 9#include "defstructure.cpp" 10 11LRESULT CALLBACK cWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 12 switch (uMsg) { 13 case WM_CREATE: 14 break; 15 16 case WM_PAINT: 17 { 18 PAINTSTRUCT ps = {}; 19 HDC hdc = GetDC(hwnd); 20 21 BeginPaint(hwnd, &ps); 22 FillRect(hdc, &ps.rcPaint, (HBRUSH)GetStockObject(GRAY_BRUSH)); 23 EndPaint(hwnd, &ps); 24 } 25 break; 26 27 case WM_DESTROY: 28 PostQuitMessage(0); 29 return 0; 30 } 31 32 return DefWindowProc(hwnd, uMsg, wParam, lParam); 33} 34 35DWORD WINAPI cwthread(LPVOID *lpvoid) { 36 PassHandle *pd; 37 pd = (PassHandle*)lpvoid; 38 HWND hwnd = pd->hwnd; 39 HINSTANCE hInst = pd->hInst; 40 41 WNDCLASSEX wc = { 42 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, cWindowProc, 43 0, 0, hInst, 44 NULL, NULL,(HBRUSH)GetStockObject(WHITE_BRUSH), 45 NULL, CHILD_CLASS_NAME, NULL 46 }; 47 48 RegisterClassEx(&wc); 49 50 HWND chwnd = CreateWindowEx( 51 0, CHILD_CLASS_NAME, L"Child", WS_CHILD | WS_OVERLAPPEDWINDOW, 52 5, 5, 960, 540, 53 hwnd, 0, hInst, 0 54 ); 55 56 ShowWindow(chwnd, SW_SHOW); 57 UpdateWindow(chwnd); 58 59 return 0; 60}
補足情報
Windows10
VisualStudio2017 Community
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。