Проблема с UpDownControl WinAPI

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
StIX
Сообщения: 20
Зарегистрирован: 13 фев 2011, 20:32
Откуда: Russian Federation
Контактная информация:

Всем доброго времени суток! Максимальное и минимальное значение не устанавливается больше чем 32767. А мне нужно установить 65535. Кто знает подскажите пожалуйста :)

Код: Выделить всё

#include <windows.h>
#include <commctrl.h>

#define IDC_EDIT0 1000
#define IDC_UPDOWN0 1001

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "UpDownControlTest", /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           200,                 /* The programs width */
           85,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    HWND hBuddy = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", NULL, WS_CHILD | WS_VISIBLE | ES_LEFT, 10, 10, 80, 25, hwnd, (HMENU) IDC_EDIT0, hThisInstance, NULL);
    CreateUpDownControl (WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_WRAP | UDS_SETBUDDYINT | UDS_ARROWKEYS | UDS_ALIGNRIGHT, 0, 0, 0, 0, hwnd, IDC_UPDOWN0, hThisInstance, hBuddy, 32767, 0, 27015);

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                    /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);        /* send a WM_QUIT to the message queue */
            break;
        default:                        /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Функция CreateUpDownControl() устаревшая, она не поддерживает границы диапазона выходящие за пределы 16-разрядных чисел (см. http://msdn.microsoft.com/en-us/library ... S.85).aspx)
Но можно с ее помощью создать up-down control, а затем задать границы диапазона:

Код: Выделить всё

...
    HWND hUpDown = CreateUpDownControl (WS_CHILD | WS_BORDER | WS_VISIBLE | UDS_WRAP | UDS_SETBUDDYINT | UDS_ARROWKEYS | UDS_ALIGNRIGHT, 0, 0, 0, 0, hwnd, IDC_UPDOWN0, hThisInstance, hBuddy, 0, 0, 0);
    SendMessage(hUpDown, UDM_SETRANGE32, 0, 65535);
    SendMessage(hUpDown, UDM_SETPOS32, 0, 34567);
...
StIX
Сообщения: 20
Зарегистрирован: 13 фев 2011, 20:32
Откуда: Russian Federation
Контактная информация:

Спасибо за ответ :) но ругается, что не знает UDM_GETRANGE32 и UDM_SETPOS32.

Код: Выделить всё

C:\Users\admin\Desktop\UpDownControlTest\main.cpp|61|error: 'UDM_SETRANGE32' was not declared in this scope|
возможно нужно что-то добавить к проекту? Подключены commctrl.h и comctl32.lib (libcomctl32.a). И еще, что тогда лучше использовать вместо устаревшей CreateUpDownControl() ?
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Не находит, поскольку эти сообщения требуют определенный декларативный уровень целевой версии Windows (т.е. под которой код будет выполняться). Не вдаваясь в подробности, поместите следующий макрос в начало кода:

Код: Выделить всё

 
#define _WIN32_IE 0x0500

#include <windows.h>
#include <commctrl.h>


Константа _WIN32_IE должна быть не ниже 5, чтобы компилировался код, показанный в предыдущем примере.
Подробнее про макросы типа _WIN32_IE можно почитать здесь: http://blogs.msdn.com/b/oldnewthing/arc ... 79137.aspx

Насчет CreateUpDownControl(): устаревшая не значит, что нельзя ей пользоваться, просто не все будет работать, как ожидается. На самом деле, эта функция сама не более чем специализированная версия CreateWindowEx , чтобы в одном вызове можно было создать контрол и настроить диапазон. Но поскольку была написана еще в эпоху 16-разрядных Windows, имеет понятные ограничения на допустимый диапазон - внутри наверняка используется вызов типа SendMessage(hUpDown, UDM_SETRANGE, 0, MAKELPARAM(low,high)). Писать версию под x32 в MS не стали, ограничились комментарием obsolete - вот и вся история. Хотите делать "правильно" - вызывайте CreateWindowEx.
StIX
Сообщения: 20
Зарегистрирован: 13 фев 2011, 20:32
Откуда: Russian Federation
Контактная информация:

Спасибо Вам :) все получилось, сделал как вы посоветовали :)
MarishafealaSoke
Сообщения: 90
Зарегистрирован: 03 май 2013, 22:15
Откуда: Россия
Контактная информация:

Скоро лето!
Привет пользователи форума forum.developing.ru, неделю назад пользователь под ником Karolino4kaCer просила меня запостить модные новинки Cумка Fiato в 2013 году, а так же обуви бренда Fiato, так вот наконец то нашла время для этого, админы прошу не удалять, а перенести в соответствующий раздел, если я ошиблась например Сумки портфели/Для женщин/Сумки
))) всех люблю)))


Cумка Fiato цена 7614 РУБ..
Если Вам нравится Cумка Fiato, нажмите кнопку "GO!" ниже чтоб узнать где выгодней всего купить Cумка Fiato бренда Fiato

Изображение Изображение


посмотрите другую модную одежду

Категория: Сумки портфели/Для женщин/Сумки
купить
Бренд: купить Cумка Fiato Fiato

А вот еще ключевые слова по которым люди ищут Cумка Fiato Fiato:
- купить Cумка Fiato Fiato
- заказать Cумка Fiato Fiato
- цена Cумка Fiato Fiato
- интернет магазин Сумки портфели/Для женщин/Сумки
Cумка Fiato Fiato

- фото Cумка Fiato Fiato
- Cумка Fiato 2012
- интернет магазин Cумка Fiato Москва
- новинки Cумка Fiato 2013
- модные Cумка Fiato 2013
- Cумка Fiato для свадьбы
- купить Cумка Fiato Москва

- купить Cумка Fiato Киев
- купить Cумка Fiato Санкт-петербург
- интернет магазин Cумка Fiato Москва


купить одежду
заказать одежду
купить обувь
заказать обувь
купить женскую одежду
купить мужскую одежду
заказать мужскую одежду
заказать женскую одежду
купить сумку
заказать сумку
купить одежду через интернет
заказать одежду через интернет
купить одежду дешево
где дешево купить одежду




#$#
Ответить