WinApi MoveWindow() lässt edit control verschwinden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • WinApi MoveWindow() lässt edit control verschwinden

    Quellcode

    1. #include <windows.h>
    2. LPCSTR MainClassName = "Texteditor";
    3. // Zum Empfangen und Auswerten der messages
    4. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
    5. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    6. {
    7. // Generelle Fensterstruktur registrieren
    8. WNDCLASSEX wc;
    9. wc.cbSize = sizeof(WNDCLASSEX);
    10. wc.style = 0;
    11. wc.lpfnWndProc = WndProc;
    12. wc.cbClsExtra = 0;
    13. wc.cbWndExtra = 0;
    14. wc.hInstance = hInstance;
    15. wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(0));
    16. wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    17. wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    18. wc.lpszMenuName = MAKEINTRESOURCE(1);
    19. wc.lpszClassName = MainClassName;
    20. wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(0), IMAGE_ICON, 16, 16, 0);
    21. if(!RegisterClassEx(&wc))
    22. {
    23. MessageBox(NULL, "Konnte das Hauptfenster nicht registrieren!", "Fehler!", MB_ICONEXCLAMATION | MB_OK);
    24. return 0;
    25. }
    26. // Fenster erstellen
    27. HWND hWnd = CreateWindowEx(
    28. WS_EX_OVERLAPPEDWINDOW,
    29. MainClassName,
    30. "Titletext",
    31. WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
    32. CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
    33. NULL,
    34. NULL,
    35. hInstance,
    36. NULL
    37. );
    38. // Textbox ins Fenster setzen
    39. HWND hEdit = CreateWindowEx(
    40. NULL,
    41. "EDIT",
    42. "Gib was ein",
    43. WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
    44. 0, 0, 400, 300,
    45. hWnd,
    46. NULL,
    47. NULL,
    48. NULL
    49. );
    50. // Fenster anzeigen
    51. ShowWindow(hWnd, iCmdShow);
    52. // Auf Messages reagieren
    53. MSG wmsg;
    54. while( GetMessage(&wmsg, NULL, 0, 0) )
    55. {
    56. TranslateMessage(&wmsg);
    57. DispatchMessage(&wmsg);
    58. }
    59. return wmsg.wParam;
    60. }
    61. HWND hEdit;
    62. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    63. {
    64. char string[255];
    65. switch (iMsg)
    66. {
    67. case WM_SIZE:
    68. MessageBox(NULL, "noch siehst du das edit control", "noch zu sehen", MB_OK);
    69. hEdit = GetTopWindow(hWnd);
    70. MoveWindow(hEdit, 0, 0, wParam, lParam, true);
    71. MessageBox(NULL, "und weg ist es", "jetzt nicht mehr", MB_OK);
    72. break;
    73. case WM_CLOSE:
    74. DestroyWindow(hWnd);
    75. break;
    76. case WM_DESTROY:
    77. PostQuitMessage(0);
    78. return 0;
    79. case WM_COMMAND:
    80. switch(LOWORD(wParam))
    81. {
    82. case 11:
    83. LoadString(GetModuleHandle(NULL), 21, string, sizeof(string));
    84. MessageBox(hWnd, string, "Öffnen", MB_ICONINFORMATION);
    85. break;
    86. case 12:
    87. LoadString(GetModuleHandle(NULL), 22, string, sizeof(string));
    88. MessageBox(hWnd, string, "Speichern", MB_ICONINFORMATION);
    89. break;
    90. case 13:
    91. DestroyWindow(hWnd);
    92. break;
    93. }
    94. break;
    95. }
    96. // An Windows weitergeben und dessen Antwort als Rückgabewert zurück
    97. return DefWindowProc(hWnd, iMsg, wParam, lParam);
    98. }
    Alles anzeigen

    Die letzten 2 Messageboxes sagen alles.
    Der code in WM_SIZE soll für eine Breiten- und Höhenanpassung zum
    top-level Fenster sorgen. Stattdessen verschwindet es einfach...
    Inwiefern muss ich umdenken?
  • Ich habe den Fehler bereits gefunden.
    Die neue Höhe und Breite des Fensters wird als lParam (long) übergeben.
    Mit LOWORD holt man die linken bytes zuner Word raus, die
    die neue Breite angibt. Mit HIWORD() die rechten bytes,
    die eine WORD für die neue Höhe eingibt.

    Quellcode

    1. #include <windows.h>
    2. LPCSTR MainClassName = "Texteditor";
    3. // Zum Empfangen und Auswerten der messages
    4. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
    5. BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) ;
    6. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    7. {
    8. // Generelle Fensterstruktur registrieren
    9. WNDCLASSEX wc;
    10. wc.cbSize = sizeof(WNDCLASSEX);
    11. wc.lpszClassName = MainClassName;
    12. wc.style = 0;
    13. wc.lpfnWndProc = WndProc;
    14. wc.hInstance = hInstance;
    15. wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    16. wc.lpszMenuName = MAKEINTRESOURCE(1);
    17. wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    18. wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(0));
    19. wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(0), IMAGE_ICON, 16, 16, 0);
    20. wc.cbClsExtra = 0;
    21. wc.cbWndExtra = 0;
    22. if(!RegisterClassEx(&wc))
    23. {
    24. MessageBox(NULL, "Konnte das Hauptfenster nicht registrieren!", "Fehler!", MB_ICONEXCLAMATION | MB_OK);
    25. return 0;
    26. }
    27. // Fenster erstellen
    28. HWND hWnd = CreateWindowEx(
    29. WS_EX_CLIENTEDGE,
    30. MainClassName,
    31. "Titletext",
    32. WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
    33. CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
    34. NULL,
    35. NULL,
    36. hInstance,
    37. NULL
    38. );
    39. // Textbox ins Fenster setzen
    40. HWND hEdit = CreateWindowEx(
    41. NULL,
    42. "EDIT",
    43. "Gib was ein",
    44. WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
    45. 0, 0, 400, 300,
    46. hWnd,
    47. NULL,
    48. NULL,
    49. NULL
    50. );
    51. // Fenster anzeigen
    52. ShowWindow(hWnd, iCmdShow);
    53. // Auf Messages reagieren
    54. MSG wmsg;
    55. while( GetMessage(&wmsg, NULL, 0, 0) )
    56. {
    57. TranslateMessage(&wmsg);
    58. DispatchMessage(&wmsg);
    59. }
    60. return wmsg.wParam;
    61. }
    62. HWND hEdit;
    63. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    64. {
    65. char string[255];
    66. switch (iMsg)
    67. {
    68. case WM_SIZE:
    69. hEdit = GetTopWindow(hWnd);
    70. MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), true);
    71. break;
    72. case WM_CLOSE:
    73. DestroyWindow(hWnd);
    74. break;
    75. case WM_DESTROY:
    76. PostQuitMessage(0);
    77. return 0;
    78. case WM_COMMAND:
    79. switch(LOWORD(wParam))
    80. {
    81. case 11:
    82. LoadString(GetModuleHandle(NULL), 21, string, sizeof(string));
    83. MessageBox(hWnd, string, "Öffnen", MB_ICONINFORMATION);
    84. break;
    85. case 12:
    86. LoadString(GetModuleHandle(NULL), 22, string, sizeof(string));
    87. MessageBox(hWnd, string, "Speichern", MB_ICONINFORMATION);
    88. break;
    89. case 13:
    90. DestroyWindow(hWnd);
    91. break;
    92. }
    93. break;
    94. }
    95. // An Windows weitergeben und dessen Antwort als Rückgabewert zurück
    96. return DefWindowProc(hWnd, iMsg, wParam, lParam);
    97. }
    Alles anzeigen


    Das handle zum edit control definiere ich global, damit es
    zu keiner cross inizialisierung kommt.