Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отображение диалоговых окон с календарём


Автор: Brodyaga 22.11.2008, 16:46
Всем здравсвуйте! Помогите пожалуйста с такой вот проблемкой... Работаю я в MSVC 2005. Создаю вин приложение стандартное с меню, в котором есть выбор File->Exit и Help->About. По выбору в меню пункта About появляется стандартное About'овское окно...
Теперь суть проблемы: захожу я, значит, в ресурсы, выбираю это About'овское окно и кидаю на него скажем радио баттон. Компилирую, запускаю.. выбираю пункт About... Всё ОК! браво! появляется окно с радио баттоном! Но вот когда я кидаю на него Date-Time Control, то при выборе пункта меню About ничего не происходит.. окно не появляется и ошибки никакой... После всевозможных проб я понял, что часть компонентов отображается также как радио баттно, а с частью происходит такая же фигня, как и с Date-Time Control'ом... В чём дело?! Помогите пожалуйста, срочно надо...

Автор: 586 22.11.2008, 16:57
InitCommonControls вызывал?

Автор: jonie 22.11.2008, 18:41
лучше манифестом баловаться, чем InitCommonControls-подобным...

Автор: Brodyaga 22.11.2008, 19:06
С CommonControl получилось, спасибо! правда не сразу.. надо было ещё comctl32.lib подключить и commctrl.h. Вот http://sdo.grsu.by/forum/index.php?PHPSESSID=f1eb35a745bc8ee9597318b54e2af5de&topic=137.0 кому интересно. А вот с манифестом не получилось...
А почему с ним лучше и как сделать?

Автор: jonie 22.11.2008, 19:29
ну манифест как бы "принято" .... явный вызов библиотеки не очень хорошо : их же есть несколько версий (по вашей ссылке указано).


http://www.msjogren.net/dotnet/eng/tools/default.asp
см. ThemeMe  - там то что надо вроде

Автор: Brodyaga 24.11.2008, 18:52
Возникла ещё одна проблема.... Теперь диалоговое окно не перетаскивается! Тоесть отобразилось на экране окно с календарём, а перетащить его в другую область экрана я не могу... Все опции окна просмотрел, ничего такого не нашёл, что могло бы помочь, подскажите в чём дело, пожалуйста!?

Автор: jonie 24.11.2008, 19:30
вероятно у вас просто не обрабатываются сообщения соотвествующие, или обрабатываются неположенным образом...

Автор: Brodyaga 24.11.2008, 19:36
А какое это сообщение? и как оно должно обрабатываца.. у меня оконная процедура для диалога стандартная:
Код

INT_PTR CALLBACK Dialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    default:
        return DefWindowProc(hDlg, message, wParam, lParam);
    }
    return (INT_PTR)FALSE;
}



Автор: Brodyaga 24.11.2008, 20:00
Ок, с этим вроде разобрался... закоментил строчки:
Код

    default:
        return DefWindowProc(hDlg, message, wParam, lParam);


и окно стало перетаскиваться... теперь у меня созрел ещё один вопрос... Как я могу по щелчку на кнопке на диалоговом окне, получить дату выбранную в календаре на этом же окне? Тоесть что нужно прописать вот тут:
Код

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }

Автор: jonie 24.11.2008, 23:41
как-то странно выглядит процедура оконная диалоговая. обычно ее делают такой:
Код

switch(uMsg) {
 case WM_PAINT:
  ....
  break;
 default: return FALSE;
}
return TRUE;

Автор: 586 24.11.2008, 23:47
http://msdn.microsoft.com/en-us/library/cc656439(VS.85).aspx

Автор: Brodyaga 25.11.2008, 18:22
jonie, так это стандартная процедура для диалогового окна, студия сама создаёт... Ну да не суть важно... Так как мне по нажатию кнопки обратица к калндарю, лежащему на этой же диалоговой форме? писать для календаря свою процедуру? только так?

Автор: Brodyaga 26.11.2008, 14:59
586, по данной вами ссылке в общем рассказывается про работу с календарём. Сейчас же мне нужно узнать как по нажатию кнопки на диалоговом окне, взять значение выбранной даты в календаре расположенном на этом же диалоговом окне.

Автор: 586 26.11.2008, 17:56
Слева, в списке статей есть главная статья: http://msdn.microsoft.com/en-us/library/bb761727(VS.85).aspx
Код
void ShowTime(HWND hDateTimePicker)
{
    TCHAR buf[256];
    SYSTEMTIME st;

    DateTime_GetSystemtime(hDateTimePicker, &st);
    // 26.11.2008 17:28:00
    _sntprintf(buf, 256, _T("%u.%02u.%04u %u:%02u:%02u"),
        (UINT)st.wDay, (UINT)st.wMonth, (UINT)st.wYear,
        (UINT)st.wHour, (UINT)st.wMinute, (UINT)st.wSecond);
    buf[255] = 0;

    MessageBox(0, buf, _T(""), 0);
}

INT_PTR CALLBACK Dialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        break;

    case WM_COMMAND:
        if(LOWORD(wParam) == IDOK)
        {
            ShowTime(GetDlgItem(hDlg, /*IDC_DATETIME*/));
            return TRUE;
        }
        return FALSE;

    case WM_CLOSE:
        EndDialog(hDlg, 0);
        break;

    default:
        return FALSE;
    }
    return TRUE;
}

Автор: Brodyaga 28.11.2008, 14:55
Спасибо! Всё получилось! Ещё такой вопросик... Есть ли какойнить макрос чтобы получить дату не строкой, а количеством миллисекунд? или как склеить полученные значения типа UINT из SYSTEMTIME в тип double ?

Автор: 586 28.11.2008, 19:32
Если нужен числовой формат, то SYSTEMTIME можно конвертировать в FILETIME (64-битное целое число).

Код
SYSTEMTIME st;
FILETIME ft;

//GetLocalTime(&st);

SystemTimeToFileTime(&st, &ft);


По поводу double, подобных функций в WinAPI не видел. Можешь посмотреть, как реализована функция Now() или объект TDateTime в исходниках VCL (Delphi), или поискать в гугле.
http://www.wasm.ru/forum/viewtopic.php?pid=168066#p168066

А зачем тебе нужно конвертировать в double?

Автор: Brodyaga 29.11.2008, 12:22
мне нужно отослать дату на веб-сервис, а он принимает её в виде double... Веб-сервис написан на С#. И там нет типа FILETIME ... Может както лучше изменить функцию веб-сервиса?

Автор: Solotoy29 29.11.2008, 21:49
У когото есть прога Електронный секретар, очень нужна на С++

Автор: jonie 30.11.2008, 13:04
Цитата

мне нужно отослать дату на веб-сервис, а он принимает её в виде double... Веб-сервис написан на С#. И там нет типа FILETIME
зато у DateTime есть DateTime::FromFileTime Method, что вам и надо

Автор: Brodyaga 30.11.2008, 14:00
Цитата

зато у DateTime есть DateTime::FromFileTime Method, что вам и надо

Точно! но как мне передать значение FILETIME на сервер? ни в long, ни в double оно не конвертица...

Автор: 586 30.11.2008, 14:22
Код
FILETIME ft;
//...
ULARGE_INTEGER i;

i.LowPart = ft.dwLowDateTime;
i.HighPart = ft.dwHighDateTime;

// в i.QuadPart будет 64-битное число


или так:
Код
FILETIME ft;
//...
UINT64 i = ((UINT64)ft.dwLowDateTime) | (((UINT64)ft.dwHighDateTime) << 32);

Автор: Brodyaga 30.11.2008, 15:05
DateTime::FromFileTime принимает long, а long 4 байта, те формулы что вы мне привели переводят в double FILETIME который 64 байта.

Добавлено через 5 минут и 17 секунд
Код

long ll=ft.dwLowDateTime;


Это будет представление FILETIME в виде long, который проглодит DateTime::FromFileTime ?? или нет?!

Автор: 586 30.11.2008, 22:15
Цитата(Brodyaga @  30.11.2008,  15:05 Найти цитируемый пост)
DateTime::FromFileTime принимает long, а long 4 байта

Цитата(http://msdn.microsoft.com/ru-ru/library/yyaad03b.aspx)
Тип данных long. В C# тип данных long является 64-разрядным, а в C++ он 32-разрядный.

А в Managed С++ там __int64 (см. скриншот).
Цитата
те формулы что вы мне привели переводят в double FILETIME который 64 байта.

Я написал, как переводить в 64-битную целочисленную переменную.

Автор: Brodyaga 1.12.2008, 11:46
Спасибо! И последний вопрос.... При первом отображении календаря там стоит выбранным текущее число и текущее время, как сделать чтобы по дефолту было выбрано другое число и время?

Автор: 586 1.12.2008, 17:07
http://msdn.microsoft.com/en-us/library/bb761813(VS.85).aspx

Автор: Brodyaga 3.12.2008, 13:02
Спасибо большое! Всё получилось! +1 ;)

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