如何在 Win32 中用一行连接 2 个文本框?

How can I connect 2 text boxes with a line in Win32?

所以我有这个项目,我必须在其中制定一个合乎逻辑的方案。我唯一需要学习做的就是可以连接到 boxe 的线。把它想象成 C++ 中的一棵树,我有气泡,我需要做的就是用一条线将它们连接起来(我在想双击第一个气泡然后按住点击直到我到达另一个气泡).这是我到目前为止的代码(更像是测试代码)

#include <stdio.h>
#include <winuser.h>
#include <iostream>
#define File_Menu_NEW 1
#define File_Menu_OPEN 2
#define File_Menu_EXIT 3
#define Change_Title 4
#define Open_file 5
#define Save_file 6
LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);

void AddMenus(HWND);
void AddControls(HWND);

HMENU hMenu;
HWND hEdit;
HWND hDestroy;
int x=100,y=100,h=200,l=20,ok;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)
{
    WNDCLASSW wc = {0};

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hInstance = hInst;
    wc.lpszClassName = L"myWindowClass";
    wc.lpfnWndProc = WindowProcedure;
    HCURSOR SetCursor(HCURSOR hCursor);
    DRAGDROP_S_USEDEFAULTCURSORS;

    if(!RegisterClassW(&wc))
        return -1;
    CreateWindowW(L"myWindowClass",L"Transformator Logic",WS_OVERLAPPEDWINDOW | WS_VISIBLE,100,100,500,500,
                  NULL,NULL,NULL,NULL);

    MSG msg={0};

    while(GetMessage(&msg,NULL,NULL,NULL) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

void display_file(char* path)
{
    FILE *file;
    file = fopen(path,"rb");
    fseek(file,0,SEEK_END);
    int _size = ftell(file);
    rewind(file);
    char *data = new char[_size+1];
    fread(data,_size,1,file);
    data[_size] = '[=10=]';

    SetWindowText(hEdit,data);

    fclose(file);
}
void open_file(HWND hWnd)
{
    OPENFILENAME ofn;

    char file_name[100];

    ZeroMemory(&ofn,sizeof(OPENFILENAME));

    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = file_name;
    ofn.lpstrFile[0] = '[=10=]';
    ofn.nMaxFile = 100;
    ofn.lpstrFilter = "All files[=10=]*.*[=10=]Source Files[=10=]*.CPP[=10=]Text Files[=10=]*.TXT[=10=]";
    ofn.nFilterIndex = 1;

    GetOpenFileName(&ofn);

    display_file(ofn.lpstrFile);

}

void write_file(char *path)
{
    FILE *file;
    file = fopen(path,"w");

    int _size = GetWindowTextLength(hEdit);
    char *data = new char[_size+1];
    GetWindowText(hEdit,data,_size+1);

    fwrite(data,_size+1,1,file);

    fclose(file);
}

void save_file(HWND hWnd)
{
    OPENFILENAME ofn;

    char file_name[100];

    ZeroMemory(&ofn,sizeof(OPENFILENAME));

    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = file_name;
    ofn.lpstrFile[0] = '[=10=]';
    ofn.nMaxFile = 100;
    ofn.lpstrFilter = "All files[=10=]*.*[=10=]Source Files[=10=]*.CPP[=10=]Text Files[=10=]*.TXT[=10=]";
    ofn.nFilterIndex = 1;

    GetSaveFileName(&ofn);

    write_file(ofn.lpstrFile);

}

LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
    switch(msg)
    {
case WM_LBUTTONDBLCLK:
{
    int xm = LOWORD(lp);
    int ym = HIWORD(lp);

}
case WM_LBUTTONDOWN:
{
    int iPosX = LOWORD(lp);
    int iPosY = HIWORD(lp);
    if(x<=iPosX&&x+l>=iPosX&&y<=iPosY&&y+h>=iPosY)
        {
            DestroyWindow(hDestroy);
            ok=1;
        }
    break;
}
case WM_LBUTTONUP:
    {
        int iPosx = LOWORD(lp);
        int iPosy = HIWORD(lp);
        x=iPosx;
        y=iPosy;
        if(ok==1)
        {
            hDestroy=CreateWindowW(L"Static",L"Drag and drop test",WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER,x,y,h,l,hWnd,
                  NULL,NULL,NULL);
                  ok=0;
        }
        break;
    }
    case WM_COMMAND:

        switch(wp)
        {

        case Open_file:
            open_file(hWnd);
            break;
        case Save_file:
            save_file(hWnd);
            break;
        case File_Menu_EXIT:
            DestroyWindow(hWnd);
            break;
        case File_Menu_NEW:
            MessageBeep(MB_ICONINFORMATION);
            break;
        case Change_Title:
            wchar_t text[100];
            GetWindowTextW(hEdit,text,100);
            SetWindowTextW(hWnd,text);
            break;
        }
    break;
    case WM_CREATE:
        AddMenus(hWnd);
        AddControls(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hWnd,msg,wp,lp);
    }
}

void AddMenus(HWND hWnd)
{
    hMenu = CreateMenu();
    HMENU hFileMenu = CreateMenu();
    HMENU hSchemePrestabilite = CreateMenu();
    HMENU hSubMenu = CreateMenu();


    AppendMenu(hMenu,MF_POPUP,(UINT_PTR)hFileMenu,"File");

    AppendMenu(hFileMenu,MF_STRING,File_Menu_NEW,"New");
    AppendMenu(hFileMenu,MF_POPUP,(UINT_PTR)hSubMenu,"Open SubMenu");
        AppendMenu(hSubMenu,MF_STRING,NULL,"SubMenu Item");
      //AppendMenu(hSubMenu,MF_STRING,Change_Title,"Change Title");
    AppendMenu(hFileMenu,MF_SEPARATOR,NULL,NULL);
    AppendMenu(hFileMenu,MF_STRING,File_Menu_EXIT,"Exit");




    AppendMenu(hMenu,MF_STRING,Open_file,"Open File");
    AppendMenu(hMenu,MF_STRING,Save_file,"Save File");

    SetMenu(hWnd,hMenu);
}

void AddControls(HWND hWnd)
{
    hDestroy =CreateWindowW(L"Static",L"Drag and drop test",WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER,x,y,h,l,hWnd,
                  NULL,NULL,NULL);
    CreateWindowW(L"Static",L"Line",WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER,100,200,200,20,hWnd,
                  NULL,NULL,NULL);
    //hEdit = CreateWindowW(L"Edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,100,100,300,300,hWnd,
                  //(HMENU)Open_file,NULL,NULL);

   // CreateWindowW(L"Button",L"Change Title",WS_VISIBLE | WS_CHILD,100,254,200,20,hWnd,
                //  (HMENU)Change_Title,NULL,NULL);

}

您需要处理 WindowProc 中的 WM_PAINT message 并自己画线:

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        HPEN hpen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); // specify line width and color
        HANDLE oldpen = SelectObject(hdc, hpen);
        MoveToEx(hdc, 10, 10, NULL); // specify "from" coordiates
        LineTo(hdc, 400, 300);       // specify "to" coordinates
        SelectObject(hdc, oldpen);
        DeleteObject(hpen);
        EndPaint(hWnd, &ps);
        break;
    }

或者,您可以创建一个可以自行绘制的 "line" 组件,并将其作为子组件添加到您的 window。