Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Visual C/C++/Win32API]Диалоговое окно


Автор: toxx 23.11.2009, 23:42
Пишу программу калькулятор за основу взял программу из книги Ч.Петзолд(Програvмирование для Win95)
Столкнулся с такой проблемой создаю диалоговое окно и хочу с помощью переключателей(AUTORADIOBUTTON)
переключать калькулятор в разные системы счисления OCT DEC HEX.Как это лучше сделать подскажите в виде кода/совета.Читал несколько раз пробовал разные методы никак не пойму что нужно.

Код

#include <windows.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//#include "popmenu.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//LRESULT CALLBACK ScrollProc(HWND, UINT, WPARAM, LPARAM);
//WNDPROC fnOldScr[3];
//HWND hwndScrol[3], hwndLabel[3], hwndValue[3], hwndRect;
//int color[3], iFocus;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    static char szAppName[] = "HexCalc";
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclass;
    wndclass.cbSize = sizeof(wndclass);
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = DLGWINDOWEXTRA;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(hInstance, szAppName);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground =(HBRUSH)(COLOR_WINDOW+0 );
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    wndclass.hIconSm = LoadIcon(hInstance, szAppName);
    RegisterClassEx(&wndclass);
    hwnd = CreateDialog(hInstance, szAppName, 0, NULL);

    /*for(int i = 0; i < 3; i++)
            hwndScrol[i] = CreateWindow("BUTTON", NULL,
                                WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
                                0, 0, 0, 0,
                                hwnd,(HMENU) i, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);*/
    ShowWindow(hwnd, iCmdShow);
    while(GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    return msg.wParam;
}
void ShowNumber(HWND hwnd, UINT iNumber)
{
    char szBuffer[20];
    SetDlgItemText(hwnd, VK_ESCAPE, strupr(ltoa(iNumber, szBuffer, 16)));
}
DWORD CalcIt(UINT iFirstNum, int iOperation, UINT iNum)
{
    switch(iOperation)
        {
            case '=' : return iNum;
            case '+' : return iFirstNum + iNum;
            case '-' : return iFirstNum - iNum;
            case '*' : return iFirstNum * iNum;
            default : return 0;
        }
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    static BOOL bNewNumber = TRUE;
    static int iOperation = '=';
    static UINT iNumber, iFirstNum;
    HWND hButton;
    switch(iMsg)
        {
            case WM_KEYDOWN : // left arrow --> backspace
                if(wParam != VK_LEFT)
            break;
            wParam = VK_BACK;// fall through
            case WM_CHAR :
                if((wParam = toupper(wParam)) == VK_RETURN)
                wParam = '=';
                hButton = GetDlgItem(hwnd, wParam);
                if(hButton != NULL)
                    {
                        SendMessage(hButton, BM_SETSTATE, 1, 0);
                        SendMessage(hButton, BM_SETSTATE, 0, 0);
                    }
                    else
                        {
                            MessageBeep(0);
                            break;
                        }// fall through
            /*case WM_SETFOCUS :
                SetFocus(hwndScrol[iFocus]);
            return 0;*/
            case WM_COMMAND :
                SetFocus(hwnd);
                if(LOWORD(wParam) == VK_BACK) // backspace
                    ShowNumber(hwnd, iNumber /= 16);
                        else if(LOWORD(wParam) == VK_ESCAPE) // escape
                            ShowNumber(hwnd, iNumber = 0);
                                else if(isxdigit(LOWORD(wParam))) // hex digit
                                    {
                                        if(bNewNumber)
                                            {
                                                iFirstNum = iNumber;
                                                iNumber = 0;
                                            }
                bNewNumber = FALSE;
                if(iNumber <= UINT_MAX >> 4)
                    ShowNumber(hwnd, iNumber = 16 * iNumber + wParam -
                        (isdigit(wParam) ? '0' : 'A' - 10));
                            else
                                MessageBeep(0);
                                    }
                            else // operation
                                {
                                    if(!bNewNumber)
                                        ShowNumber(hwnd, iNumber =
                                            CalcIt(iFirstNum, iOperation, iNumber));
                                    bNewNumber = TRUE;
                                    iOperation = LOWORD(wParam);
                                }
                switch(LOWORD(wParam))
                {    
                    case 112 :
                    case 113 :
                    case 114 :
                            CheckRadioButton(hwnd, 10, 17, LOWORD
                                                (wParam));
                }
            return 0;

            case WM_DESTROY :
                PostQuitMessage(0);
            return 0;
}
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}



Код

#include <windows.h>
HexCalc ICON favicon.ico
HexCalc DIALOG 32768, 0, 150, 122
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "HexCalc"
CAPTION "Hex Calculator"
{
    PUSHBUTTON "D", 68, 8, 24, 14, 14,WS_BORDER
    PUSHBUTTON "A", 65, 8, 40, 14, 14,WS_BORDER
    PUSHBUTTON "7", 55, 8, 56, 14, 14,WS_BORDER
    PUSHBUTTON "4", 52, 8, 72, 14, 14,WS_BORDER
    PUSHBUTTON "1", 49, 8, 88, 14, 14,WS_BORDER
    PUSHBUTTON "0", 48, 8, 104, 14, 14,WS_BORDER
    PUSHBUTTON "0", 27, 26, 4, 50, 14,WS_BORDER
    //CONTROL text, id, class, style, x, y, width, height
    //PUSHBUTTON text, id, x, y, width, height [, style]
    PUSHBUTTON "E", 69, 26, 24, 14, 14,WS_BORDER
    PUSHBUTTON "B", 66, 26, 40, 14, 14,WS_BORDER
    PUSHBUTTON "8", 56, 26, 56, 14, 14,WS_BORDER
    PUSHBUTTON "5", 53, 26, 72, 14, 14,WS_BORDER
    PUSHBUTTON "2", 50, 26, 88, 14, 14,WS_BORDER
    PUSHBUTTON "Back", 8, 26, 104, 32, 14,WS_BORDER
    PUSHBUTTON "C", 67, 44, 40, 14, 14,WS_BORDER
    PUSHBUTTON "F", 70, 44, 24, 14, 14,WS_BORDER
    PUSHBUTTON "9", 57, 44, 56, 14, 14,WS_BORDER
    PUSHBUTTON "6", 54, 44, 72, 14, 14,WS_BORDER
    PUSHBUTTON "3", 51, 44, 88, 14, 14,WS_BORDER
    PUSHBUTTON "+", 43, 62, 24, 14, 14,WS_BORDER
    PUSHBUTTON "-", 45, 62, 40, 14, 14,WS_BORDER
    PUSHBUTTON "*", 42, 62, 56, 14, 14,WS_BORDER
    PUSHBUTTON "/", 47, 62, 72, 14, 14,WS_BORDER
    PUSHBUTTON "==", 61, 62, 104, 32, 14,WS_BORDER
    CONTROL "", -1, "BUTTON", BS_GROUPBOX, 98, 14, 45, 60
    CONTROL "&OCT", 7, "BUTTON", BS_AUTORADIOBUTTON|WS_GROUP, 100, 21, 40, 20
    CONTROL "&DEC", 8, "BUTTON", BS_AUTORADIOBUTTON, 100, 37, 40, 20
    CONTROL "&HEX", 9, "BUTTON", BS_AUTORADIOBUTTON, 100, 53, 40, 20
}



Автор: likehood 29.11.2009, 00:18
Лучше спросить в http://forum.vingrad.ru/index.php?show_type=forum&showforum=96 форуме.

Автор: Carlos0N 29.11.2009, 15:01
а ещё лучше не писать на этом дурацком widows аpi =))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)