Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: Qraizer
Дата сообщения: 29.11.2006 12:24
Неужто Форт ещё жив?? Я как его изучал, так ни разу не использовал. Уж и забыл, наверное.
А чё тут справочников искать? Всё есть в MSDN. По крайней мере о Wind-ах.
ИМХО задержки - это драйвера уровня ядра. Надо ж всех опросить, не возражают ли они, чтоб лотком двигали. Если ты жмёшь кнопку, то лоток тебя сразу слушается, а всех не спрашивают - только рассылают уведомление. Впрочем, счас проверил на Far-е, он тоже умеет лотком рулить, так при пустом лотке время реакции ~0.3 секунды в обе стороны.
Для блокирования кнопки имеется специальная команда в протоколе ATAPI. Вообще, для низкоуровнего управления девайсами (точнее, их драйверами) нужно в первую очередь смотреть DeviceIoControl(). Там же, в MSDN.
Автор: Thritt
Дата сообщения: 03.12.2006 00:02
подскажите пожалуйста в чем ошибка, обрабатываю сообщение WM_DRAWITEM, хочу сделать хайлайт для кнопок:
case WM_DRAWITEM:
        pdis = LPDRAWITEMSTRUCT(lParam);
        cbtndc = CreateCompatibleDC(pdis->hDC);
        if (pdis->itemState & ODS_SELECTED)
        {
            switch (pdis->CtlID)
            {
            case ID_BTN1:
                SelectObject(cbtndc, bm3);
                break;
            case ID_BTN2:
                SelectObject(cbtndc, bm5);
                break;
            }
        }
        else
        {
//почемуто вот эта часть кода не выполняется или игнорируется ODS_HOTLIGHT
//-----------
            if (pdis->itemState & ODS_HOTLIGHT)
            {
                switch(pdis->CtlID)
                {
                case ID_BTN1:
                    SelectObject(cbtndc, bm6);
                    break;
                case ID_BTN2:
                    SelectObject(cbtndc, bm7);
                    break;
                }
            }
//--------
            else
            {
                switch(pdis->CtlID)
                {
                case ID_BTN1:
                    SelectObject(cbtndc, bm1);
                    break;
                case ID_BTN2:
                    SelectObject(cbtndc, bm4);
                    break;
                }
            }
        }
        BitBlt(pdis->hDC, 0, 0, 130, 35, cbtndc, 0, 0, SRCCOPY);
        DeleteDC(cbtndc);
        break;
Автор: ShIvADeSt
Дата сообщения: 04.12.2006 01:15
Thritt

Цитата:
почемуто вот эта часть кода не выполняется или игнорируется ODS_HOTLIGHT

нету у кнопок данного флага, читай хелп. Хотлайт только для менюшек (для Button ов по другому это все делается).
Автор: xdude
Дата сообщения: 12.12.2006 01:38
Товарищи, такой вопрос возник: использую CHtmlDialog как базовый класс для диалога. Получаю указатель на элемент в HTML-документе этого диалога, и юаю функцию getAttribute, чтобы получить значение параметра value="bla-bla" в этом ХТМЛе. getAttribute возвращает мне VARIANT, в котором параметр bstrVal содержит ссылку на строку "bla-bla". Далее чудеса: если юзаю bstrVal в функции FormatMessage, MessageBox и т.д. (т.е., в чисто API-функциях), выдается нормальный результат: bla-bla. Как только пытаюсь передать ее как параметр в функцию wcslen(v.bstrVal) или sprintf("Value: %S\n",v.bstrVal) - программа выполняет недопустимую операцию. То же самое, если я этим указателем инициализирую строку std::wstring. Я не силен во всяких там адресных пространствах, но возможно, нужно заюзать на нее что-то типа GlobalLock или LocalLock или подобное этому. чтобы получить нормальный указатель? Тогда, как это сделать, тупым тайп-кастом, ведь в эти функции нужно передавать не указатель, а HANDLE?

Добавлено:
Ага, я понял. в чем там проблема. Ошибка возникает, когда поле не заполнено, а если оно заполнено - то все ОК. Хотя, опять же не понятно: почему виндовые функции (MessageBox, например) при этом работают без ошибок, а стандартные C/C++ тупят?
Автор: Collapse_Troll
Дата сообщения: 09.01.2007 23:33
спасибо всем кто помогал с программой для управления сидюком, в особенности tomegadeth.

p.s.:Кстати всех с прошедшими и с наступающим СНГ!
Автор: YasonDelAlt
Дата сообщения: 10.01.2007 11:02
Приветствую!

Подскажите, есть функции на подобии BitBlt() но без использования контекстов устройств, а то мне нужно создавать в памяти Bitmap, потом на основе другого Bitmap'а (точнее из его кусков), заполнять, а далее скармливать нужной функции, которая и разбирается куда, как и где вывобить.
Помогите плиз! Я еще очень маленький, в школу хожу.
Автор: xdude
Дата сообщения: 10.01.2007 13:51
YasonDelAlt
Создается Memory DC, на нем делается SelectObject, в который передается HBITMAP, и теперь рисуя на этом DC ты рисуешь на битмапе.
Автор: Nikosss
Дата сообщения: 12.01.2007 17:06
У меня вопрос. Как нужно объявить массив, состоящий из компонент Button?
К примеру пишу:

TButton a[10];

Мне это нужно, чтобы иметь возможность перебирать через цикл компоненты Button1, Button2, Buttton3, ... Может кто-то подскажет лучший вариант?
Автор: TeXpert
Дата сообщения: 12.01.2007 18:07
Nikosss
Во-первых, какое отношение дурацкое), извиняюсь, Delphi/Builder имеет отношение к WinAPI?
Во-вторых, задай вопрос в другой теме, а по секрету скажу, что есть решение проще: используй свойство Tag.
Автор: Nikosss
Дата сообщения: 12.01.2007 18:14
У меня вопрос. Как нужно объявить массив, состоящий из компонент Button?
К примеру пишу:

TButton a[10];

Мне это нужно, чтобы иметь возможность перебирать через цикл компоненты Button1, Button2, Buttton3, ... Может кто-то подскажет лучший вариант?
Автор: Jokerjar
Дата сообщения: 13.01.2007 04:29
Может так будет работать?

Код: TButton * rb[10];
...
for (int i=0;i<=9;i++)
rb[i] = (TButton *)(FindComponent("Button"+IntToStr(i+1)));
Автор: TeXpert
Дата сообщения: 13.01.2007 08:14
Nikosss
Я же тебе ответил, предыдущий пост? И зачем свой пост дублировать?

Jokerjar
По-моему, это не предмет этой темы.
Автор: Collapse Troll
Дата сообщения: 28.02.2007 15:58
Здравствуйте!

У меня к вам даже 2 вопроса.

1) В windows справа от кнопки start обычно есть иконка - "Свернуть все" или "Show Desktop". Это одна команда, или последовательное сворачивание всех окон? Как это сделать на винапи?

2) возможно ли как-то программно отключить флешку? Не обязательно на чистом winapi, может есть какие-то библиотечные функции (из .NET фреймворка к примеру)
Автор: tomegadeth
Дата сообщения: 28.02.2007 20:48
Collapse Troll - ответ на первый вопрос

Код:
#include "windows.h"

// 407 - ShowDesktop

void DoAction(unsigned int pAction)
{
static HWND hShellWnd = FindWindow("Shell_TrayWnd", NULL);

if(hShellWnd != NULL)
PostMessage(hShellWnd, WM_COMMAND, MAKELONG(pAction, 0), NULL);
else
hShellWnd = FindWindow("Shell_TrayWnd", NULL);
}

int main(int argc, char* argv[])
{
DoAction(407);
return 0;
}
Автор: Collapse_Troll
Дата сообщения: 01.03.2007 09:02
tomegadeth, спасибо, это 5!
Автор: MorisA
Дата сообщения: 10.03.2007 02:30
Создание таблицы.

Подскажите пожалуйста, как создать таблицу в Visual C++.
Пытался создать путём мастера, с помощью панели Controls. Добавляю Custom Control, прописываю имя класса, а так же id... что нужно дальше делать? Как обрашаться к ячейкам, добалять данные, брать их от туда, выводить на экран?
Автор: Garrett
Дата сообщения: 10.03.2007 09:13
MorisA
Идешь на CodeProject, берешь MFCGridCrtl, радуешься.
Автор: MorisA
Дата сообщения: 10.03.2007 19:23
Garrett
Как я понимаю сайт www.codeproject.com, там такой функции нет, поиск тоже результатов не даёт.
Автор: Garrett
Дата сообщения: 10.03.2007 20:24
MorisA
Это не функция, а контрол. Искать надо лучше. Эх, молодежь, молодежь...
Вот ссылка - http://www.codeproject.com/miscctrl/gridctrl.asp
Автор: MorisA
Дата сообщения: 13.03.2007 06:38
<b>Garrett</b>
Проблема не в том, что я найти не могу, ибо похожий проект я находил, только не на этом сайте, а в том что комментариев которые даны к данному контрлу для меня маловато. Почти ничего не понятно, проект урезал, выкинул лишние файлы, функции... в данном проекте всё компилиться, работает нормально, можно данные заносить, изменять ....
Создаю свой точно такой же проект, MFC AppWizard(exe), сначала добавляю таблицу, даю точно такое же имя класса, затем вписываю точно те же переменные как и том проекте, в BOOL CGridCtrlDemoDlg::OnInitDialog(), и точно так же с другими файлами... затем подключаю основные файлы, с того проекта, их я не менял. Всё компилиться, линкуеться нормально, но когда пытаешься запустить exe файл выскакивает ошибка:
"Debug Assertion Failed, Programm: ...., File: afxwin2.inl, Line: 112"
нажимаешь пропустить ещё пару похожих ошибок, затем запускаеться окно, но без таблицы.
И классы сравнивал, и переменные с предыдушим проектом, всё точно также, там они работают, а у меня нет.

Чё делать не знаю, перечитал всю документацию по этому контрлу, но проблему так решить и не могу.

Автор: Garrett
Дата сообщения: 13.03.2007 08:21
MorisA
Этим контролом пользуются десятки тысяч человек, не без мелких ошибок, но он рабочий.
Лично у меня в промышленной программе работает уже второй или третий год.

Ошибки контрола ищутся по его форуму, там есть анонсы не только ошибок/проблем, но и их фиксы. Имхо, если нужно редактирование данных, то это лучший контрол с адекватным поведением.
А если тебе нужно только выводить данные, то используй CListCtrl в режиме рипорта.
Автор: Thritt
Дата сообщения: 20.04.2007 22:54
Всем привет! у меня возникла проблема с созданием контекстного меню в приложении Win32.

///// main.cpp ////////////
#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrInst, LPSTR lpCmdLine, int nShowCmd)
{
    HWND hWnd;
    char WndClassName[] = "wndclassname";
    MSG msg;
    WNDCLASSEX wnd;
    wnd.cbClsExtra = 0;
    wnd.cbSize = sizeof(wnd);
    wnd.cbWndExtra = 0;
    wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
    wnd.hIcon = 0;
    wnd.hIconSm = 0;
    wnd.hInstance = hInst;
    wnd.lpfnWndProc = WndProc;
    wnd.lpszClassName = WndClassName;
    wnd.lpszMenuName = 0;
    wnd.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClassEx(&wnd);

    hWnd = CreateWindow(WndClassName, "Context Menu", WS_OVERLAPPEDWINDOW,
        100, 100, 500, 300, NULL, NULL, hInst, NULL);

    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HMENU menu;
    int x, y;

    switch (msg)
    {
// наверное что-то неладное у меня в следующем коде:
///////////////////////////////////////////////////////////////////////////////////////////////////////
    case WM_CREATE:
menu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDM_CONTEXT));
        menu = GetSubMenu(menu, 0);
        break;
    case WM_CONTEXTMENU:
        x = LOWORD(lParam);
        y = HIWORD(lParam);
        TrackPopupMenuEx(menu, 0, x, y, hWnd, NULL);
        break;
////////////////////////////////////////////////////////////////////////////////////////////////////////
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}

//////////////////////////////////////// resource.h /////////////////////////////////
#define IDM_CONTEXT 1000
#define ID_COM_1 1001
#define ID_COM_2 1002
#define ID_COM_3 1003

в книжке написано что нужно определить нулевой пункт меню нулевого уровня как подменю, имеющее какое-нибудь условное имя.

//////////////////// resource.rc /////////////////////////////////
1000 MENU DISCARDABLE
BEGIN
    POPUP "menu"
    BEGIN
        MENUITEM "Command1" 1001
        MENUITEM "Command2" 1002
        MENUITEM "Command3" 1003
    END
END

в итоге никакого контекстного меню не появляетс
Подскажите пожалуйста в чем проблема.
Автор: Lyrik
Дата сообщения: 20.04.2007 23:11
Thritt
проблема видимо в том, что ты создаешь автоматическую переменную menu, а она нужна статическая:

Код: static HMENU menu;
Автор: Thritt
Дата сообщения: 21.04.2007 10:54
Lyrik

Огромное спасибо за помощь!
Автор: vshersh
Дата сообщения: 23.04.2007 15:37
Пишу службу. Как правильно организовать взаимодействие службы с пользователем.
Предполагаю такое решение:
1) есть служба, которая запускается автоматически и выполняет необходимые действия (например это некоторый TCP-сервис). При запуске сервера (на котором зарегистирована эта служба) служба автоматически стартует.
2) Если в систему входит некоторый пользователь, - хочется в трэе отображатть некоторую иконку, из контекстного меню которой можно будет останавливать и запускать эту службу - а также, возможно, конфигурировать параметры службы.


Так вот, собственно, вопрос: можно ли как-то из службы определить, что пользователь залогинился, чтобы запустить GUI-шную часть? Или это неправильный план .
Нужно ли делать для службы и для конфигурационной части разные exe-файлы, или можно это в один файл засунуть?
В общем, кто занимался подобными проблемами - поделитесь опытом.
Автор: plazzmex
Дата сообщения: 19.05.2007 14:00
у меня вопрос.
как сделать чтоб при нажатии правой кнопкой мыши на окне в том месте появлялось меню??
я пытался в 'WindowProcedure' сделать 'case WM_RBUTTONDOWN:' и создать обычное меню но у меня ничего не получилось..
я новичок, пожалуйста помогите с вопросом
Автор: FireZone
Дата сообщения: 19.05.2007 14:17
plazzmex
Нужно использовать TrackPopupMenu или TrackPopupMenuEx. Если нет локального msdn, то почитать можно здесь
Автор: Lyrik
Дата сообщения: 19.05.2007 14:40
FireZone
А пример мона взять на несколько постов выше
Смотри пост Thritt!
Автор: plazzmex
Дата сообщения: 19.05.2007 15:55
огромное спасибо.!
все получилось !

теперь есть еще один маленький вопрос.
как узнать разрешение экрана
Автор: FireZone
Дата сообщения: 19.05.2007 16:32
plazzmex
GetDeviceCaps или GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.