额外减小 发表于 2023-8-30 15:58:21

Virtual Casio 窗口部分大致完成,先发出来看看

rt.
由于windows没有透明按钮的组件,所以我就用判断鼠标点击位置的方法来判断点到的是哪一个按钮。
采集这些按钮的坐标位置真是让人吐血...目前就采集了8个,效果还算可以。
实现效果:点击图片中按钮所在位置时会弹出窗口,表示感应到点击~(上面8个按钮有效)

下一步就是做显示屏的控件了,要求根据按钮的点击作出相应的反馈。这个等我借到了卡西欧再说。
最近需要主打加减乘除乘方等常规按键的响应~可能会用到Python,因为不想手打高精度~

附件:



我的代码:
#include <windows.h>
#include <cstdio>// sprintf

void test_draw_line(HDC hdc, int x1, int y1, int x2, int y2, COLORREF color) ;
void test_draw_rect(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color);
WINBOOL clicked_in_region(int x1,int y1,int x2,int y2,int Pos_x,int Pos_y);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void show_click_pt(int Pos_x,int Pos_y);

void test_draw_line(HDC hdc, int x1, int y1, int x2, int y2, COLORREF color)
{
    HPEN hPen = CreatePen(PS_SOLID, 1, color);// 创建画笔对象
    HPEN hOldPen = static_cast<HPEN>(SelectObject(hdc, hPen));// 选择画笔对象

    MoveToEx(hdc, x1, y1, NULL);
    LineTo(hdc, x2, y2);

    SelectObject(hdc, hOldPen);// 恢复原来的画笔对象
    DeleteObject(hPen);// 删除创建的画笔对象
}

void test_draw_rect(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color)
{
        test_draw_line(hdc,x1,y1,x2,y1,color);
        test_draw_line(hdc,x1,y2,x2,y2,color);
        test_draw_line(hdc,x1,y1,x1,y2,color);
        test_draw_line(hdc,x2,y1,x2,y2,color);
}

void show_click_pt(int Pos_x,int Pos_y)
{
        char str={'\0'};
        sprintf(str,"click_pos:( %d , %d )",Pos_x,Pos_y);
        MessageBoxA(NULL,str,TEXT("notice"),MB_OK);
}

/*Button_names   x1   y1   x2       y2
* Btn_shift      54   249    78       273            
* Btn_alpha       92      250    116      272            
* Btn_menu      237   252    260      271            
* Btn_on         277   249   301      272         
* Btn_upBtn_downBtn_leftBtn_right
   Btn_up          162    247    190      269         
   Btn_down      164      289    192      306            
   Btn_left       133   264    153       291            
   Btn_reght   202      265    222       293                                                
* Btn_optn                                 
* Btn_calc                                 
* Btn_integ                                 
* Btn_var_x                                 
* Btn_frac                                 
* Btn_sqrt                                 
* Btn_sqr                                 
* Btn_pow                                 
* Btn_log                                 
* Btn_ln                                 
* Btn_minus                                 
* Btn_dms                                 
* Btn_recip                                 
* Btn_sin                                 
* Btn_cos                                 
* Btn_tan                                 
* Btn_sto                                 
* Btn_eng                                 
* Btn_lbrack                                 
* Btn_rbrack                                 
* Btn_s_d                                 
* Btn_mplus                                 
* Btn_num_0 ... Btn_num_9                                 
* Btn_dot                                 
* Btn_10pow_x                                 
* Btn_plusBtn_minusBtn_multiBtn_divBtn_equal                                 
* Btn_del                                 
* Btn_ac                                 
*/



WINBOOL clicked_in_region(int x1,int y1,int x2,int y2,int Pos_x,int Pos_y)//after message WM_LBUTTONDOWN
{
        return PtInRegion(CreateRectRgn(x1,y1,x2,y2),Pos_x,Pos_y);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSA wc = {0}; // 使用 WNDCLASSA 结构体
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = "MyWindowClass"; // 使用多字节字符串

    RegisterClassA(&wc); // 使用 RegisterClassA 函数

    HWND hwnd = CreateWindowA("MyWindowClass", "Virtual CASIO fx-991CN X", WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT, 380, 700, NULL, NULL, hInstance, NULL);
                              
    HWND Btn_num_0=CreateWindow(
                "BUTTON"," 0 ",
                WS_CHILD|WS_VISIBLE,
                100,100,100,30,
                hwnd,
                (HMENU)1,
                hInstance,
                NULL);
   
   

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

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

    return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
            case WM_COMMAND:
                    if(lParam and HIWORD(wParam)==BN_CLICKED)
                    {
                            if(HWND(lParam)==GetDlgItem(hwnd,1))
                            {
                                    MessageBox(hwnd,"button_num_0 pressed","notice",MB_OK);
                                }
                        }
                        return 0;
      case WM_PAINT:
      {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

                        // 贴图
            HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "casio_image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            if (hBitmap)
            {
                BITMAP bitmap;
                GetObject(hBitmap, sizeof(BITMAP), &bitmap);
                int bmpWidth = bitmap.bmWidth;
                int bmpHeight = bitmap.bmHeight;

                HDC hdcMem = CreateCompatibleDC(hdc);
                HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);

                BitBlt(hdc, 0, 0, bmpWidth, bmpHeight, hdcMem, 0, 0, SRCCOPY);

                SelectObject(hdcMem, hOldBitmap);
                DeleteDC(hdcMem);
                DeleteObject(hBitmap);
            }
            
            //test_draw_line/rect
            test_draw_rect(hdc,40,50,90,100,RGB(255,0,0));
            
            
            test_draw_line(hdc,11,45,14,19,RGB(255,0,0));
            test_draw_line(hdc,234,121,485,321,RGB(0,0,255));

            EndPaint(hwnd, &ps);
            return 0;
      }
      case WM_DESTROY:
      {
            PostQuitMessage(0);
            return 0;
      }
      case WM_LBUTTONDOWN:
      {
              int xp=LOWORD(lParam),yp=HIWORD(lParam);
              //show_click_pt(Pos_x,Pos_y);
              /*if(clicked_in_region(10,10,200,200,Pos_x,Pos_y))
              {
                      MessageBoxA(hwnd,TEXT("transparent"),TEXT("lalala caution"),MB_OK);
                        }*/
                        if(clicked_in_region(54,249,78,273,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("shift"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(92,250,116,272,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("alpha"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(237,252,260,271,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("menu"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(277,249,301,272,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("on"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(162,247,190,269,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("up"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(164,289,192,306,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("down"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(133,264,153,291,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("left"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(202,265,222,293,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("right"),TEXT("clicked"),MB_OK);
                        }
                        return 0;
                }
      default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

额外减小 发表于 2023-8-30 15:59:39

编译记得加上 -mwindows

liuhongrun2022 发表于 2023-8-30 21:25:54

有时间看看

额外减小 发表于 2023-8-30 22:55:22

代码改进
对于上半部分黑色按钮均有反馈

#include <windows.h>
#include <cstdio>// sprintf
//#include "casio_buttons.h"
#define id_Btn_shift 0x00
#define id_Btn_alpha 0x01
#define id_Btn_menu 0x02
#define id_Btn_on 0x03
#define id_Btn_up 0x04
#define id_Btn_down 0x05
#define id_Btn_left 0x06
#define id_Btn_right 0x07
#define id_Btn_optn 0x08
#define id_Btn_calc 0x09
#define id_Btn_integ 0x0a
#define id_Btn_var_x 0x0b
#define id_Btn_frac 0x0c
#define id_Btn_sqrt 0x0d
#define id_Btn_sqr 0x0e
#define id_Btn_pow 0x0f
#define id_Btn_log 0x10
#define id_Btn_ln 0x11
#define id_Btn_minus 0x12
#define id_Btn_dms 0x13
#define id_Btn_recip 0x14
#define id_Btn_sin 0x15
#define id_Btn_cos 0x16
#define id_Btn_tan 0x17
#define id_Btn_sto 0x18
#define id_Btn_eng 0x19
#define id_Btn_lbrack 0x1a
#define id_Btn_rbrack 0x1b
#define id_Btn_s_d 0x1c
#define id_Btn_mplus 0x1d
#define id_Btn_num_0 0x1e
#define id_Btn_num_1 0x1f
#define id_Btn_num_2 0x20
#define id_Btn_num_3 0x21
#define id_Btn_num_4 0x22
#define id_Btn_num_5 0x23
#define id_Btn_num_6 0x24
#define id_Btn_num_7 0x25
#define id_Btn_num_8 0x26
#define id_Btn_num_9 0x27
#define id_Btn_dot 0x28
#define id_Btn_10pow_x 0x29
#define id_Btn_op_plus 0x2a
#define id_Btn_op_minus 0x2b
#define id_Btn_op_multi 0x2c
#define id_Btn_op_div 0x2d
#define id_Btn_op_equal 0x2e
#define id_Btn_del 0x2f
#define id_Btn_ac 0x30


void test_draw_line(HDC hdc, int x1, int y1, int x2, int y2, COLORREF color) ;
void test_draw_rect(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color);
WINBOOL clicked_in_region(int x1,int y1,int x2,int y2,int Pos_x,int Pos_y);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void show_click_pt(int Pos_x,int Pos_y);
int Btn_clicked_id(int Pos_x,int Pos_y);

int Btn_clicked_id(int xp,int yp,HWND hwnd)
{
        if(clicked_in_region(54,249,78,273,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("shift"),TEXT("clicked"),MB_OK);
                return id_Btn_shift;
        }
        else if(clicked_in_region(92,250,116,272,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("alpha"),TEXT("clicked"),MB_OK);
                return id_Btn_alpha;
        }
        else if(clicked_in_region(237,252,260,271,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("menu"),TEXT("clicked"),MB_OK);
                return id_Btn_menu;
        }
        else if(clicked_in_region(277,249,301,272,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("on"),TEXT("clicked"),MB_OK);
                return id_Btn_on;
        }
        else if(clicked_in_region(162,247,190,269,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("up"),TEXT("clicked"),MB_OK);
                return id_Btn_up;
        }
        else if(clicked_in_region(164,289,192,306,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("down"),TEXT("clicked"),MB_OK);
                return id_Btn_down;
        }
        else if(clicked_in_region(133,264,153,291,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("left"),TEXT("clicked"),MB_OK);
                return id_Btn_left;
        }
        else if(clicked_in_region(202,265,222,293,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("right"),TEXT("clicked"),MB_OK);
                return id_Btn_right;
        }
        else if(clicked_in_region(49,301,84,320,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("optn"),TEXT("clicked"),MB_OK);
                return id_Btn_optn;
        }
        else if(clicked_in_region(92,301,128,321,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("calc"),TEXT("clicked"),MB_OK);
                return id_Btn_calc;
        }
        else if(clicked_in_region(227,301,262,319,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("integ"),TEXT("clicked"),MB_OK);
                return id_Btn_integ;
        }
        else if(clicked_in_region(271,303,305,320,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("var_x"),TEXT("clicked"),MB_OK);
                return id_Btn_var_x;
        }
        else if(clicked_in_region(49,337,84,358,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("frac"),TEXT("clicked"),MB_OK);
                return id_Btn_frac;
        }
        else if(clicked_in_region(94,338,172,355,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sqrt"),TEXT("clicked"),MB_OK);
                return id_Btn_sqrt;
        }
        else if(clicked_in_region(136,338,172,355,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sqr"),TEXT("clicked"),MB_OK);
                return id_Btn_sqr;
        }
        else if(clicked_in_region(183,337,218,357,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("pow"),TEXT("clicked"),MB_OK);
                return id_Btn_pow;
        }
        else if(clicked_in_region(227,339,261,356,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("log"),TEXT("clicked"),MB_OK);
                return id_Btn_log;
        }
        else if(clicked_in_region(270,337,305,356,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("ln"),TEXT("clicked"),MB_OK);
                return id_Btn_ln;
        }
        else if(clicked_in_region(49,375,84,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("minus"),TEXT("clicked"),MB_OK);
                return id_Btn_minus;
        }
        else if(clicked_in_region(94,375,129,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("dms"),TEXT("clicked"),MB_OK);
                return id_Btn_dms;
        }
        else if(clicked_in_region(138,375,173,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("recip"),TEXT("clicked"),MB_OK);
                return id_Btn_recip;
        }
        else if(clicked_in_region(182,375,216,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sin"),TEXT("clicked"),MB_OK);
                return id_Btn_sin;
        }
        else if(clicked_in_region(228,375,261,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("cos"),TEXT("clicked"),MB_OK);
                return id_Btn_cos;
        }
        else if(clicked_in_region(271,375,306,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("tan"),TEXT("clicked"),MB_OK);
                return id_Btn_tan;
        }
        else if(clicked_in_region(48,410,83,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sto"),TEXT("clicked"),MB_OK);
                return id_Btn_sto;
        }
        else if(clicked_in_region(94,410,127,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("eng"),TEXT("clicked"),MB_OK);
                return id_Btn_eng;
        }
        else if(clicked_in_region(137,409,172,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("lbrack"),TEXT("clicked"),MB_OK);
                return id_Btn_lbrack;
        }
        else if(clicked_in_region(182,409,218,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("rbrack"),TEXT("clicked"),MB_OK);
                return id_Btn_rbrack;
        }
        else if(clicked_in_region(227,409,261,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("s_d"),TEXT("clicked"),MB_OK);
                return id_Btn_s_d;
        }
        else if(clicked_in_region(271,409,306,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("mplus"),TEXT("clicked"),MB_OK);
                return id_Btn_mplus;
        }
        return 0xff;
}

void test_draw_line(HDC hdc, int x1, int y1, int x2, int y2, COLORREF color)
{
    HPEN hPen = CreatePen(PS_SOLID, 1, color);// 创建画笔对象
    HPEN hOldPen = static_cast<HPEN>(SelectObject(hdc, hPen));// 选择画笔对象

    MoveToEx(hdc, x1, y1, NULL);
    LineTo(hdc, x2, y2);

    SelectObject(hdc, hOldPen);// 恢复原来的画笔对象
    DeleteObject(hPen);// 删除创建的画笔对象
}

void test_draw_rect(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color)
{
        test_draw_line(hdc,x1,y1,x2,y1,color);
        test_draw_line(hdc,x1,y2,x2,y2,color);
        test_draw_line(hdc,x1,y1,x1,y2,color);
        test_draw_line(hdc,x2,y1,x2,y2,color);
}

void show_click_pt(int Pos_x,int Pos_y)
{
        char str={'\0'};
        sprintf(str,"click_pos:( %d , %d )",Pos_x,Pos_y);
        MessageBoxA(NULL,str,TEXT("notice"),MB_OK);
}

WINBOOL clicked_in_region(int x1,int y1,int x2,int y2,int Pos_x,int Pos_y)//after message WM_LBUTTONDOWN
{
        return PtInRegion(CreateRectRgn(x1,y1,x2,y2),Pos_x,Pos_y);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSA wc = {0}; // 使用 WNDCLASSA 结构体
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = "MyWindowClass"; // 使用多字节字符串

    RegisterClassA(&wc); // 使用 RegisterClassA 函数

    HWND hwnd = CreateWindowA("MyWindowClass", "Virtual CASIO fx-991CN X", WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT, 380, 700, NULL, NULL, hInstance, NULL);
                              
    HWND Btn_num_0=CreateWindow(
                "BUTTON"," 0 ",
                WS_CHILD|WS_VISIBLE,
                100,100,100,30,
                hwnd,
                (HMENU)1,
                hInstance,
                NULL);
       
       

        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);

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

        return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch (uMsg)
        {
                case WM_COMMAND:
                        if(lParam and HIWORD(wParam)==BN_CLICKED)
                        {
                                if(HWND(lParam)==GetDlgItem(hwnd,1))
                                {
                                        MessageBox(hwnd,"button_num_0 pressed","notice",MB_OK);
                                }
                        }
                        return 0;
                case WM_PAINT:
                {
                        PAINTSTRUCT ps;
                        HDC hdc = BeginPaint(hwnd, &ps);

                        // 贴图
                        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "casio_image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                        if (hBitmap)
                        {
                                BITMAP bitmap;
                                GetObject(hBitmap, sizeof(BITMAP), &bitmap);
                int bmpWidth = bitmap.bmWidth;
                int bmpHeight = bitmap.bmHeight;

                HDC hdcMem = CreateCompatibleDC(hdc);
                HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);

                BitBlt(hdc, 0, 0, bmpWidth, bmpHeight, hdcMem, 0, 0, SRCCOPY);

                SelectObject(hdcMem, hOldBitmap);
                DeleteDC(hdcMem);
                DeleteObject(hBitmap);
            }
            
            //test_draw_line/rect
            test_draw_rect(hdc,40,50,90,100,RGB(255,0,0));
            
            
            test_draw_line(hdc,11,45,14,19,RGB(255,0,0));
            test_draw_line(hdc,234,121,485,321,RGB(0,0,255));

            EndPaint(hwnd, &ps);
            return 0;
      }
      case WM_DESTROY:
      {
            PostQuitMessage(0);
            return 0;
      }
      case WM_LBUTTONDOWN:
      {
              int xp=LOWORD(lParam),yp=HIWORD(lParam);
              //show_click_pt(xp,yp);
              Btn_clicked_id(xp,yp,hwnd);
              /*if(clicked_in_region(10,10,200,200,Pos_x,Pos_y))
              {
                      MessageBoxA(hwnd,TEXT("transparent"),TEXT("lalala caution"),MB_OK);
                        }*/
                        /*
                        if(clicked_in_region(54,249,78,273,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("shift"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(92,250,116,272,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("alpha"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(237,252,260,271,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("menu"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(277,249,301,272,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("on"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(162,247,190,269,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("up"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(164,289,192,306,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("down"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(133,264,153,291,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("left"),TEXT("clicked"),MB_OK);
                        }
                        else if(clicked_in_region(202,265,222,293,xp,yp))
                        {
                                MessageBoxA(hwnd,TEXT("right"),TEXT("clicked"),MB_OK);
                        }
                        */
                        return 0;
                }
      default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

额外减小 发表于 2023-8-31 15:52:32

最新版窗口代码,窗口设计部分告一段落。
下一步就是做每个按钮对应的功能啦

额外减小 发表于 2023-8-31 15:53:12

#include <windows.h>
#include <cstdio>// sprintf
#define id_Btn_shift 0x00
#define id_Btn_alpha 0x01
#define id_Btn_menu 0x02
#define id_Btn_on 0x03
#define id_Btn_up 0x04
#define id_Btn_down 0x05
#define id_Btn_left 0x06
#define id_Btn_right 0x07
#define id_Btn_optn 0x08
#define id_Btn_calc 0x09
#define id_Btn_integ 0x0a
#define id_Btn_var_x 0x0b
#define id_Btn_frac 0x0c
#define id_Btn_sqrt 0x0d
#define id_Btn_sqr 0x0e
#define id_Btn_pow 0x0f
#define id_Btn_log 0x10
#define id_Btn_ln 0x11
#define id_Btn_minus 0x12
#define id_Btn_dms 0x13
#define id_Btn_recip 0x14
#define id_Btn_sin 0x15
#define id_Btn_cos 0x16
#define id_Btn_tan 0x17
#define id_Btn_sto 0x18
#define id_Btn_eng 0x19
#define id_Btn_lbrack 0x1a
#define id_Btn_rbrack 0x1b
#define id_Btn_s_d 0x1c
#define id_Btn_mplus 0x1d
#define id_Btn_num_0 0x1e
#define id_Btn_num_1 0x1f
#define id_Btn_num_2 0x20
#define id_Btn_num_3 0x21
#define id_Btn_num_4 0x22
#define id_Btn_num_5 0x23
#define id_Btn_num_6 0x24
#define id_Btn_num_7 0x25
#define id_Btn_num_8 0x26
#define id_Btn_num_9 0x27
#define id_Btn_dot 0x28
#define id_Btn_10pow_x 0x29
#define id_Btn_op_plus 0x2a
#define id_Btn_op_minus 0x2b
#define id_Btn_op_multi 0x2c
#define id_Btn_op_div 0x2d
#define id_Btn_op_equal 0x2e
#define id_Btn_del 0x2f
#define id_Btn_ac 0x30
#define id_Btn_ans 0x31


void test_draw_line(HDC hdc, int x1, int y1, int x2, int y2, COLORREF color) ;
void test_draw_rect(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color);
WINBOOL clicked_in_region(int x1,int y1,int x2,int y2,int Pos_x,int Pos_y);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void show_click_pt(int Pos_x,int Pos_y);
int Btn_clicked_id(int Pos_x,int Pos_y);

int Btn_clicked_id(int xp,int yp,HWND hwnd)
{
        if(clicked_in_region(54,249,78,273,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("shift"),TEXT("clicked"),MB_OK);
                return id_Btn_shift;
        }
        else if(clicked_in_region(92,250,116,272,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("alpha"),TEXT("clicked"),MB_OK);
                return id_Btn_alpha;
        }
        else if(clicked_in_region(237,252,260,271,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("menu"),TEXT("clicked"),MB_OK);
                return id_Btn_menu;
        }
        else if(clicked_in_region(277,249,301,272,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("on"),TEXT("clicked"),MB_OK);
                return id_Btn_on;
        }
        else if(clicked_in_region(162,247,190,269,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("up"),TEXT("clicked"),MB_OK);
                return id_Btn_up;
        }
        else if(clicked_in_region(164,289,192,306,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("down"),TEXT("clicked"),MB_OK);
                return id_Btn_down;
        }
        else if(clicked_in_region(133,264,153,291,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("left"),TEXT("clicked"),MB_OK);
                return id_Btn_left;
        }
        else if(clicked_in_region(202,265,222,293,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("right"),TEXT("clicked"),MB_OK);
                return id_Btn_right;
        }
        else if(clicked_in_region(49,301,84,320,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("optn"),TEXT("clicked"),MB_OK);
                return id_Btn_optn;
        }
        else if(clicked_in_region(92,301,128,321,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("calc"),TEXT("clicked"),MB_OK);
                return id_Btn_calc;
        }
        else if(clicked_in_region(227,301,262,319,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("integ"),TEXT("clicked"),MB_OK);
                return id_Btn_integ;
        }
        else if(clicked_in_region(271,303,305,320,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("var_x"),TEXT("clicked"),MB_OK);
                return id_Btn_var_x;
        }
        else if(clicked_in_region(49,337,84,358,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("frac"),TEXT("clicked"),MB_OK);
                return id_Btn_frac;
        }
        else if(clicked_in_region(94,338,172,355,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sqrt"),TEXT("clicked"),MB_OK);
                return id_Btn_sqrt;
        }
        else if(clicked_in_region(136,338,172,355,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sqr"),TEXT("clicked"),MB_OK);
                return id_Btn_sqr;
        }
        else if(clicked_in_region(183,337,218,357,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("pow"),TEXT("clicked"),MB_OK);
                return id_Btn_pow;
        }
        else if(clicked_in_region(227,339,261,356,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("log"),TEXT("clicked"),MB_OK);
                return id_Btn_log;
        }
        else if(clicked_in_region(270,337,305,356,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("ln"),TEXT("clicked"),MB_OK);
                return id_Btn_ln;
        }
        else if(clicked_in_region(49,375,84,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("minus"),TEXT("clicked"),MB_OK);
                return id_Btn_minus;
        }
        else if(clicked_in_region(94,375,129,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("dms"),TEXT("clicked"),MB_OK);
                return id_Btn_dms;
        }
        else if(clicked_in_region(138,375,173,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("recip"),TEXT("clicked"),MB_OK);
                return id_Btn_recip;
        }
        else if(clicked_in_region(182,375,216,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sin"),TEXT("clicked"),MB_OK);
                return id_Btn_sin;
        }
        else if(clicked_in_region(228,375,261,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("cos"),TEXT("clicked"),MB_OK);
                return id_Btn_cos;
        }
        else if(clicked_in_region(271,375,306,391,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("tan"),TEXT("clicked"),MB_OK);
                return id_Btn_tan;
        }
        else if(clicked_in_region(48,410,83,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("sto"),TEXT("clicked"),MB_OK);
                return id_Btn_sto;
        }
        else if(clicked_in_region(94,410,127,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("eng"),TEXT("clicked"),MB_OK);
                return id_Btn_eng;
        }
        else if(clicked_in_region(137,409,172,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("lbrack"),TEXT("clicked"),MB_OK);
                return id_Btn_lbrack;
        }
        else if(clicked_in_region(182,409,218,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("rbrack"),TEXT("clicked"),MB_OK);
                return id_Btn_rbrack;
        }
        else if(clicked_in_region(227,409,261,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("s_d"),TEXT("clicked"),MB_OK);
                return id_Btn_s_d;
        }
        else if(clicked_in_region(271,409,306,429,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("mplus"),TEXT("clicked"),MB_OK);
                return id_Btn_mplus;
        }
        else if(clicked_in_region(48,580,92,611,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_0"),TEXT("clicked"),MB_OK);
                return id_Btn_num_0;
        }
        else if(clicked_in_region(48,535,91,567,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_1"),TEXT("clicked"),MB_OK);
                return id_Btn_num_1;
        }
        else if(clicked_in_region(102,536,145,566,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_2"),TEXT("clicked"),MB_OK);
                return id_Btn_num_2;
        }
        else if(clicked_in_region(157,537,200,566,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_3"),TEXT("clicked"),MB_OK);
                return id_Btn_num_3;
        }
        else if(clicked_in_region(48,492,91,524,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_4"),TEXT("clicked"),MB_OK);
                return id_Btn_num_4;
        }
        else if(clicked_in_region(101,492,146,522,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_5"),TEXT("clicked"),MB_OK);
                return id_Btn_num_5;
        }
        else if(clicked_in_region(155,493,198,521,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_6"),TEXT("clicked"),MB_OK);
                return id_Btn_num_6;
        }
        else if(clicked_in_region(47,447,91,476,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_7"),TEXT("clicked"),MB_OK);
                return id_Btn_num_7;
        }
        else if(clicked_in_region(101,448,145,476,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_8"),TEXT("clicked"),MB_OK);
                return id_Btn_num_8;
        }
        else if(clicked_in_region(156,447,198,477,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("num_9"),TEXT("clicked"),MB_OK);
                return id_Btn_num_9;
        }
        else if(clicked_in_region(101,580,146,611,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("dot"),TEXT("clicked"),MB_OK);
                return id_Btn_dot;
        }
        else if(clicked_in_region(157,580,199,611,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("10pow_x"),TEXT("clicked"),MB_OK);
                return id_Btn_10pow_x;
        }
        else if(clicked_in_region(210,537,253,567,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("op_plus"),TEXT("clicked"),MB_OK);
                return id_Btn_op_plus;
        }
        else if(clicked_in_region(263,537,307,567,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("op_minus"),TEXT("clicked"),MB_OK);
                return id_Btn_op_minus;
        }
        else if(clicked_in_region(210,492,253,521,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("op_multi"),TEXT("clicked"),MB_OK);
                return id_Btn_op_multi;
        }
        else if(clicked_in_region(264,493,307,521,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("op_div"),TEXT("clicked"),MB_OK);
                return id_Btn_op_div;
        }
        else if(clicked_in_region(264,493,307,612,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("op_equal"),TEXT("clicked"),MB_OK);
                return id_Btn_op_equal;
        }
        else if(clicked_in_region(210,447,254,477,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("del"),TEXT("clicked"),MB_OK);
                return id_Btn_del;
        }
        else if(clicked_in_region(263,447,306,475,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("ac"),TEXT("clicked"),MB_OK);
                return id_Btn_ac;
        }
        else if(clicked_in_region(209,581,252,610,xp,yp))
        {
                MessageBoxA(hwnd,TEXT("ans"),TEXT("clicked"),MB_OK);
                return id_Btn_ans;
        }
       
        return 0xff;
}

void test_draw_line(HDC hdc, int x1, int y1, int x2, int y2, COLORREF color)
{
    HPEN hPen = CreatePen(PS_SOLID, 1, color);// 创建画笔对象
    HPEN hOldPen = static_cast<HPEN>(SelectObject(hdc, hPen));// 选择画笔对象

    MoveToEx(hdc, x1, y1, NULL);
    LineTo(hdc, x2, y2);

    SelectObject(hdc, hOldPen);// 恢复原来的画笔对象
    DeleteObject(hPen);// 删除创建的画笔对象
}

void test_draw_rect(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color)
{
        test_draw_line(hdc,x1,y1,x2,y1,color);
        test_draw_line(hdc,x1,y2,x2,y2,color);
        test_draw_line(hdc,x1,y1,x1,y2,color);
        test_draw_line(hdc,x2,y1,x2,y2,color);
}

void show_click_pt(int Pos_x,int Pos_y)
{
        char str={'\0'};
        sprintf(str,"click_pos:( %d , %d )",Pos_x,Pos_y);
        MessageBoxA(NULL,str,TEXT("notice"),MB_OK);
}

WINBOOL clicked_in_region(int x1,int y1,int x2,int y2,int Pos_x,int Pos_y)//after message WM_LBUTTONDOWN
{
        return PtInRegion(CreateRectRgn(x1,y1,x2,y2),Pos_x,Pos_y);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSA wc = {0}; // 使用 WNDCLASSA 结构体
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = "MyWindowClass"; // 使用多字节字符串

    RegisterClassA(&wc); // 使用 RegisterClassA 函数

    HWND hwnd = CreateWindowA("MyWindowClass", "Virtual CASIO fx-991CN X", WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT, 380, 700, NULL, NULL, hInstance, NULL);
                              
    HWND Btn_num_0=CreateWindow(
                "BUTTON"," 0 ",
                WS_CHILD|WS_VISIBLE,
                100,100,100,30,
                hwnd,
                (HMENU)1,
                hInstance,
                NULL);
       
       

        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);

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

        return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch (uMsg)
        {
                case WM_COMMAND:
                        if(lParam and HIWORD(wParam)==BN_CLICKED)
                        {
                                if(HWND(lParam)==GetDlgItem(hwnd,1))
                                {
                                        MessageBox(hwnd,"button_num_0 pressed","notice",MB_OK);
                                }
                        }
                        return 0;
                case WM_PAINT:
                {
                        PAINTSTRUCT ps;
                        HDC hdc = BeginPaint(hwnd, &ps);

                        // 贴图
                        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "casio_image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                        if (hBitmap)
                        {
                                BITMAP bitmap;
                                GetObject(hBitmap, sizeof(BITMAP), &bitmap);
                int bmpWidth = bitmap.bmWidth;
                int bmpHeight = bitmap.bmHeight;

                HDC hdcMem = CreateCompatibleDC(hdc);
                HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);

                BitBlt(hdc, 0, 0, bmpWidth, bmpHeight, hdcMem, 0, 0, SRCCOPY);

                SelectObject(hdcMem, hOldBitmap);
                DeleteDC(hdcMem);
                DeleteObject(hBitmap);
            }
            
            //test_draw_line/rect
            test_draw_rect(hdc,40,50,90,100,RGB(255,0,0));
            
            
            test_draw_line(hdc,11,45,14,19,RGB(255,0,0));
            test_draw_line(hdc,234,121,485,321,RGB(0,0,255));

            EndPaint(hwnd, &ps);
            return 0;
      }
      case WM_DESTROY:
      {
            PostQuitMessage(0);
            return 0;
      }
      case WM_LBUTTONDOWN:
      {
              int xp=LOWORD(lParam),yp=HIWORD(lParam);
              //show_click_pt(xp,yp);
              Btn_clicked_id(xp,yp,hwnd);
                        return 0;
                }
      default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

额外减小 发表于 2023-8-31 15:54:09

由于我采取的是位图,按钮做的是用像素点位置来判断,所以应该可移植性很强

cjjJasonchen 发表于 2023-8-31 17:04:16

这啥啊

额外减小 发表于 2023-8-31 17:05:01

cjjJasonchen 发表于 2023-8-31 17:04
这啥啊

一个窗口程序。是我的计划的一部分

cjjJasonchen 发表于 2023-8-31 17:26:48

我趣汇编?厉害啊!这么叼的怎么发在吹水{:10_250:}

额外减小 发表于 2023-8-31 18:12:22

cjjJasonchen 发表于 2023-8-31 17:26
我趣汇编?厉害啊!这么叼的怎么发在吹水

?不是啊,是c++

cjjJasonchen 发表于 2023-8-31 20:06:55

额外减小 发表于 2023-8-31 18:12
?不是啊,是c++

{:10_282:}

除了scratch,其他在python玩家眼里全是汇编{:10_266:}

笑死

额外减小 发表于 2023-8-31 21:27:38

cjjJasonchen 发表于 2023-8-31 20:06
除了scratch,其他在python玩家眼里全是汇编

笑死

6
页: [1]
查看完整版本: Virtual Casio 窗口部分大致完成,先发出来看看