I'm making a basic calculator with a C interface with the help of the Win32 API. I've already done the graphic part (I'll leave a screenshot below) and now I need to finish the code.
I could already add text to the Edit Control using buttons. I want that when selecting buttons 1 and 2, the number 12 is typed.
The problem is that when doing so, one number is overwriting another. If I select button 1 and then 2, the number 1 is written, then it is erased and 2 is written.
Do you know how I can fix it? I would also like to know how I can save the data that is inside the Edit control in a variable and then do operations with it.
Excuse me if these are somewhat basic things, I am just starting out with Win32 API. I leave you what I have of the code, thank you very much :)
#include <windows.h>
#include "resource.h"
HWND text;
BOOL CALLBACK mycallback(HWND window, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_CLOSE: {
DestroyWindow(window);
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
case WM_INITDIALOG:
{
text = GetDlgItem(window, IDC_EDIT1);
break;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"1");
break;
}
case IDC_BUTTON2:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"2");
break;
}
case IDC_BUTTON3:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"3");
break;
}
case IDC_BUTTON4:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"4");
break;
}
case IDC_BUTTON5:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"5");
break;
}
case IDC_BUTTON6:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"6");
break;
}
case IDC_BUTTON7:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"7");
break;
}
case IDC_BUTTON8:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"8");
break;
}
case IDC_BUTTON9:
{
SendMessage(text, WM_SETTEXT, 0, (LPARAM)"9");
break;
}
case IDC_BUTTON10:
{
SendMessage(text, WM_SETTEXT, 0,(LPARAM)"0");
break;
}
}
}
return false;
}
int WINAPI WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d) {
DialogBox(a, MAKEINTRESOURCE(IDD_DIALOG1), NULL, mycallback);
return 0;
}
CodePudding user response:
The simplest way would be to get the text of the control first, append a new digit to it, and then set it.
See GetWindowText and SetWindowText
CodePudding user response:
You could ask for the current text using GetWindowText, append the new text, and follow up with another call to SetWindowText.
Or simply use the Edit control's built-in functionality, and send it an EM_REPLACESEL message. If there is no selection, the new text is inserted at the current caret position.
Reading text back into a variable is best handled in response to an EN_CHANGE notification.