question

DanielShepherd-8507 avatar image
0 Votes"
DanielShepherd-8507 asked DanielShepherd-8507 answered

When is this part of code declared?

I am following the tutorial on modeless_dialogs.html about dialog boxes. In an example, when it shows the code CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_TOOLBAR), hwnd, ToolDlgProc);, at the end it shows ToolDlgProc. And I have one question. When is this defined? How can I implement this? What do I have to add to define something like that?



windows-apic++vs-general
· 1
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

The article you're using shows you.

0 Votes 0 ·
Castorix31 avatar image
0 Votes"
Castorix31 answered Castorix31 commented

Declare it at beginning :

 BOOL CALLBACK ToolDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
· 2
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Where do i define this?

0 Votes 0 ·
Castorix31 avatar image Castorix31 DanielShepherd-8507 ·

At beginning, for example after #include <windows.h>

0 Votes 0 ·
DanielShepherd-8507 avatar image
0 Votes"
DanielShepherd-8507 answered DanielShepherd-8507 commented

Here is my code:

include "framework.h"

include "my windows app.h"

include "d2d1.h"

include <d2d1helper.h>

include <dwrite.h>

include <wincodec.h>

include "winuser.h"

include <iostream>

include "Header.h"

include "Resource.h"

BOOL CALLBACK mydialog(HWND hwnd, UINT Dialog1, WPARAM, LPARAM lParam);

define MAX_LOADSTRING 100


// Global Variables:
HINSTANCE hInst; // current instance
WCHAR szTitle[MAX_LOADSTRING]; // The title bar text
WCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(In HINSTANCE hInstance,
In_opt HINSTANCE hPrevInstance,
In LPWSTR lpCmdLine,
In int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

 // TODO: Place code here.

 // Initialize global strings
 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 LoadStringW(hInstance, IDC_MYWINDOWSAPP, szWindowClass, MAX_LOADSTRING);
 MyRegisterClass(hInstance);

 // Perform application initialization:
 if (!InitInstance (hInstance, nCmdShow))
 {
     return FALSE;
 }

 HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MYWINDOWSAPP));

 MSG msg;

 // Main message loop:
 while (GetMessage(&msg, nullptr, 0, 0))
 {
     if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
     {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
 }

 return (int) msg.wParam;

}



//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;

 wcex.cbSize = sizeof(WNDCLASSEX);

 wcex.style          = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc    = WndProc;
 wcex.cbClsExtra     = 0;
 wcex.cbWndExtra     = 0;
 wcex.hInstance      = hInstance;
 wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYWINDOWSAPP));
 wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
 wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_MYWINDOWSAPP);
 wcex.lpszClassName  = szWindowClass;
 wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 return RegisterClassExW(&wcex);

}

//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable

HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
TCHAR test[] = _T("welcome to my app :D");
TCHAR testagain[] = _T("try clicking about :D");
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case ID_OPENDIALOG_OPENDIALOGBOXTHATIMADE:
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, About);
case IDM_ABOUT:
{
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, mydialog);
break;
return 0;
}
case IDM_EXIT:
MessageBox(hWnd, L"bye", L"bye!", MB_OK | MB_ICONHAND);
DestroyWindow(hWnd);
break;
case ID_CLOSEWINDOWFORSOMETREASON_YESCLOSEIT:
DestroyWindow(hWnd);
break;
case ID_MAKESOMETEXT:
{
case WM_PAINT:
{
TCHAR outtext[] = _T("ok here it is mr magic man");
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,
10,30,
outtext, _tcslen(outtext));
EndPaint(hWnd, &ps);
}
break;
}
case ID_OTHERS_DESTROYWINDOW:
{
DestroyWindow(hWnd);
break;
return 0;
}
case ID_OTHERS_CLOSEWINDOW:
{
std::cout << "test \n";
CloseWindow(hWnd);
break;
return 0;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_MDIMAXIMIZE:
{
if (MessageBox(hWnd, L"you have maximized the window.", L"thx", MB_OK) == IDOK){
SC_MAXIMIZE;
}
}
case WM_LBUTTONDOWN:
{
MessageBox(hWnd, L"test", L"test", MB_OKCANCEL | MB_ICONINFORMATION);
testheaderfunc();
object.integer = 1;

     break;
     return 0;
 }
 case WM_RBUTTONDOWN:
 {
     MessageBox(hWnd, L"you have right clicked the window", L"right click", MB_OK | MB_ICONASTERISK);
     break;
     return 0;
 }
 case WM_KEYDOWN:
 {
     MessageBox(hWnd, L"", L"", MB_YESNOCANCEL | MB_USERICON);
     break;
     return 0;
 }
 case WM_CLOSE:
 {
     if (MessageBox(hWnd, L"you have called WM_CLOSE. goodbye!", L"WM_CLOSE called", MB_OK | MB_ICONWARNING) == IDOK) {
         DestroyWindow(hWnd);
         return 0;
     }
 }
 case WM_PAINT:
     {
         PAINTSTRUCT ps;
         HDC hdc = BeginPaint(hWnd, &ps);
         TextOut(hdc,
             5, 5,
             test, _tcslen(test));
         TextOut(hdc,
             10, 20,
             testagain, _tcslen(testagain));
         EndPaint(hWnd, &ps);
     }
     break;
 case WM_DESTROY:
     PostQuitMessage(0);
     break;
 default:
     return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;

}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

 case WM_COMMAND:
     if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
     {
         EndDialog(hDlg, LOWORD(wParam));
         return (INT_PTR)TRUE;
     }
     break;
 }
 return (INT_PTR)FALSE;

}
it returns two errors:
115416-screenshot-2021-07-16-082133.png



· 2
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Once it is declared, you must add the body of the function (the code of the procedure)

BOOL CALLBACK mydialog(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
// etc...

like in the sample page you posted

0 Votes 0 ·

This worked, but it got one error: "hwnd is undefined"

0 Votes 0 ·
RLWA32-6355 avatar image
0 Votes"
RLWA32-6355 answered

Now that you have declared your dialog procedure function at the top of your source file you must include the body of your function, the function definition, in the source file also. For convenience, just place it in it's entirety at the very bottom of your source file.

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

DanielShepherd-8507 avatar image
0 Votes"
DanielShepherd-8507 answered DanielShepherd-8507 commented

okay. These examples work, but it says hWnd is undefined.

· 12
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

If I understand you correctly the posted code above which included the declaration of the mydialog function but omitted its body compiled successfully but failed to link due to the omission. If you have now included the body of that function and have compile errors then the mistake resides in the code that you just inserted which we have not seen.

0 Votes 0 ·

My code now:``

 BOOL CALLBACK mydialog(HWND hwnd, UINT Dialog1, WPARAM, LPARAM lParam);
     {
         switch (message) {
         case ID_OPENDIALOG_OPENDIALOGBOXTHATIMADE:
         {
             DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), hwnd, mydialog);
         }
     }


0 Votes 0 ·
   BOOL CALLBACK mydialog(HWND hwnd, UINT Dialog1, WPARAM, LPARAM lParam);
      {
          switch (message) {
          case ID_OPENDIALOG_OPENDIALOGBOXTHATIMADE:
          {
              DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), hwnd, mydialog);
          }
      }

Aside from the fact that the mydialog function posted above contains errors (e.g.,message is not declared, no return value) what is the question now?

0 Votes 0 ·
Show more comments
DanielShepherd-8507 avatar image
0 Votes"
DanielShepherd-8507 answered Castorix31 commented

Ok, this is one of my first windows apps. I am making a dialog function. it is returning an error no matter what. I am using visual studio 2019. Using c++ desktop wizard.

· 7
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

After the wizard creates the application study the dialog procedure that it creates for the About dialog box. Use that dialog procedure as a guide for any modal dialog that you create. Of course you will need to change the code if you create modeless dialogs, but that was covered in the tutorial you studied earlier.

0 Votes 0 ·

Ok. this only returns 1 error. and that is c2065. here is the code snippet:

 BOOL CALLBACK mydialog(HWND hwnd, UINT Dialog1, WPARAM, LPARAM lparam);


0 Votes 0 ·

The code you posted appears to be a function declaration. Did you look up and read the possible causes for the compiler error that was issued? Also, please post the full text of the error message received.

0 Votes 0 ·
Show more comments
DanielShepherd-8507 avatar image
0 Votes"
DanielShepherd-8507 answered

I have fixed the error, by calling BOOL CALLBACK right below where it declared the About function. Then, I added a return value to it. The code worked without errors! The dialog box does not open, but that is not related to this issue.

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

DanielShepherd-8507 avatar image
0 Votes"
DanielShepherd-8507 answered

I have fixed the error, by calling BOOL CALLBACK right below where it declared the About function. Then, I added a return value to it. The code worked without errors! The dialog box does not open, but that is not related to this issue.

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

DanielShepherd-8507 avatar image
0 Votes"
DanielShepherd-8507 answered

I have fixed the error, by calling BOOL CALLBACK right below where it declared the About function. Then, I added a return value to it. The code worked without errors! The dialog box does not open, but that is not related to this issue.

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.