【问题标题】:How to delete a button at an other button's click win32 api with c?如何使用c在其他按钮单击win32 api时删除一个按钮?
【发布时间】:2016-06-29 21:58:10
【问题描述】:

大家好,我有这个问题,我一直试图解决很长时间。我正在使用 code::blocks 用 C 创建一个 win 32 gui 应用程序;

我想用按钮创建一个菜单,所以当你点击一个按钮时; 将出现一个按钮列表;如果您单击其他按钮,列表将发生变化,依此类推。

我设法创建了按钮列表,但是当我需要销毁它们时,DestroyWindow 函数什么也不做,按钮仍然存在(我也尝试过向按钮发送 WM_CLOSE 和 WM_DESTROY 消息)。 我会给出一个示例代码,请告诉我我做错了什么,这让我发疯了。

PS:我使用的是 c 而不是 c++,因为我不得不这样做。

提前谢谢大家


#include <windows.h>
#include <wchar.h>
#include <stdbool.h>
#define B 115
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,WPARAM wParam, LPARAM lParam) 
{
  HWND button1,button2;
 switch(msg)
{case WM_CREATE:


           button1 =  CreateWindowW(L"Button", L"Button to push", WS_VISIBLE | WS_CHILD|BS_FLAT|BS_PUSHBUTTON|WS_BORDER,
                                    0,0, 100, 80, hwnd, (HMENU) B, GetModuleHandle(NULL), NULL);
            button2 =  CreateWindowW(L"Button", L"Button to kill", WS_VISIBLE | WS_CHILD|BS_FLAT|BS_PUSHBUTTON|WS_BORDER,
                                    100,0, 100, 80, hwnd, 0, GetModuleHandle(NULL), NULL);
        break; 

case WM_COMMAND:
         if(LOWORD(wParam)==B)
         {  
             DestroyWindow(button2); //here i destroy the button 2 if button 1 was clicked
         }
    break;
case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
}

return DefWindowProcW(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
 {

MSG  msg;
HWND W;
WNDCLASSW ClassP;

ClassP.style         = CS_HREDRAW | CS_VREDRAW;
ClassP.cbClsExtra    = 0;
ClassP.cbWndExtra    = 0;
ClassP.lpszClassName = L"FenetrePrincipale";
ClassP.hInstance     = hInstance;
ClassP.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
ClassP.lpszMenuName  = NULL;
ClassP.lpfnWndProc   = WndProc;
ClassP.hCursor       = LoadCursor(NULL, IDC_ARROW);
ClassP.hIcon         = LoadIcon(NULL, IDI_ERROR);
RegisterClassW(&ClassP);
W = CreateWindowW(ClassP.lpszClassName, L"PROBLEM SAMPLE CODE",
            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
            100, 100, 300, 300, NULL, NULL, hInstance, NULL);
ShowWindow(W, nCmdShow);
UpdateWindow(W);
while (GetMessage(&msg, NULL, 0, 0)) {

    DispatchMessage(&msg);
}

return (int) msg.wParam;
}

【问题讨论】:

  • 按钮没有被破坏,还是窗口没有重绘?
  • 我不知道,但我认为按钮没有被破坏,我怎么知道?
  • if(!IsWindow(button2) || !button2) OutputDebugStringW("Button2 被破坏了!");
  • 是的,它被破坏了;那么如何在没有按钮的情况下重绘窗口呢?
  • 不幸的是按钮仍然存在

标签: c user-interface winapi


【解决方案1】:

您的问题在于 button1button2 的本地范围。

在使用 WM_COMMAND 消息调用 WndProc 后,您提供了未初始化的指针,因此不会删除任何按钮。

解决办法:

    ..........

#define B 115

HWND button1,button2; //<-add here

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,WPARAM wParam, LPARAM lParam) 
{
  //HWND button1,button2; //<-comment or delete this
 switch(msg)
{case WM_CREATE:

..............

【讨论】:

  • 成功了,非常感谢,我真的很感激
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多