Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

VictorMi

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Простая задача - по нажатию кнопки взять текст из окна и запихнуть в Clipboard.
Работает через раз. Похоже что-то не так с GlobalUnlock, но не могу понять
 
Подскажите пожалуйста
 
Вот фрагмент
 case IDW_BUT_ST1:    
       {
        GetWindowText(hEDI_STR,s000,MAX_STR_LEN-1);
        if(SendMessage(hCHB_SAVE_CLIP,BM_GETCHECK,0,0)==BST_CHECKED)
         {
          HGLOBAL hgl=GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE ,20000);
          if(hgl==NULL) break;
          LPSTR s4=(LPSTR)GlobalLock(hgl);
          strcpy(s4,s000);
          int a1=OpenClipboard(hWnd);
          int a2=EmptyClipboard();
          HANDLE hc=SetClipboardData(CF_TEXT,hgl);
          int a3=GlobalUnlock(hgl);
          DWORD a4=GetLastError();
          HGLOBAL a5=GlobalFree(hgl);
          int a6=CloseClipboard();
         }
 
        }
       break;
 
 
Abs62 БОЛЬШОЕ СПАСИБО! Начинаю понимать

Всего записей: 819 | Зарегистр. 30-06-2004 | Отправлено: 19:25 18-03-2008 | Исправлено: VictorMi, 13:16 19-03-2008
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VictorMi

Цитата:
After SetClipboardData is called, the system owns the object identified by the hMem parameter. The application can read the data, but must not free the handle or leave it locked until the CloseClipboard function is called.  

То бишь после формирования строки сначала надо сделать GlobalUnlock, только после этого SetClipboardData, и затем CloseClipboard. А дальше система сама разберётся, что с этим хэндлом делать.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 20:19 18-03-2008
cartman007



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожайлуста как будет выглядеть скрипт(простой батничек) для копирования папки с файлами на указанное место.
Например надо скопировать папку с данными с пути C:Новая папка в диск G: и чтобы на экран процесс копирования не выводился.
И если можно то сделать так чтобы если вдруг скрипт был запущен второй раз и будет производиться вторая попытка копирования файлов то те которые были скопированы будут просто замещены.
я попробовал такой
md G:/papka
copy /Y C:/papka/*.* G:/papka
но выдает ошибку в синтаксисе
Заранее спасибо за ответ!!!

Всего записей: 11 | Зарегистр. 02-11-2007 | Отправлено: 11:51 19-03-2008
Djony1987

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такой вопрос: как мне проверять находится ли мышь в данном окне при нажатии или нет?
Поискал функцию..так и не смог найти...а через координаты запутался жестко((  

Всего записей: 52 | Зарегистр. 12-03-2008 | Отправлено: 12:33 19-03-2008
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cartman007
Батники рассматриваются в этой теме.
 
Djony1987
Вообще-то, при нажатии кнопки сообщение отправляется именно тому окну, над которым находится указатель (если мышь не захвачена). Если нужно определить попадает ли указатель в конкретную область, придётся таки разобраться с координатами, посмотреть функции PtInRect, PtInRegion и т.д.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:37 19-03-2008
Djony1987

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Спасибо! Начал токо недавно осваивать API (в ВУзе всмысле). Поэтому прошу сильно не пинать.
Задание было следующие: Углы рабочей области окна приложения полностью занимают 4 временных окна одного класса. Если нажать левую клавишу мыши над временным окном, то это окно выдает сообщение о своем заголовке.
 
Листинг моей проги:

Код:
 
//---------------------------------------------------------------------------
 
#include <windows.h>
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
LRESULT CALLBACK HelloWorldWndProc(HWND, UINT, UINT, LONG);
HWND hChildWind_1, hChildWind_2, hChildWind_3, hChildWind_4;
char szClassName[]="Hello World!";
char nameWnd[4][18]={"Временное окно №1","Временное окно №2","Временное окно №3","Временное окно №4"};
MSG Msg;
RECT R;
int x1,x2,y1,y2;
TPoint p;
 
int WINAPI WinMain(HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszCmdParam,
                        int nCmdShow)
{
        HWND hWnd;
        WNDCLASS WndClass;
        WndClass.style=CS_HREDRAW | CS_VREDRAW;
        WndClass.lpfnWndProc=HelloWorldWndProc;
        WndClass.cbClsExtra=0;
        WndClass.cbWndExtra=0;
        WndClass.hInstance=hInstance;
        WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
        WndClass.hCursor=LoadCursor(NULL, IDC_ARROW);
        WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
        WndClass.lpszMenuName=NULL;
        WndClass.lpszClassName=szClassName;
 
        if(!RegisterClass(&WndClass))
        {
              MessageBox(NULL, "Невозможно зарегистрировать класс", "Ошибка!!", MB_OK);
              return 0;
        }
 
        hWnd=CreateWindow(szClassName, "Прога №1", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL);
 
        if(!hWnd)
        {
                MessageBox(NULL, "Невозможно создать окно", "Ошибка!!", MB_OK);
                return 0;
        }
 
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
 
        int w=GetSystemMetrics(SM_CYCAPTION);
        GetWindowRect(hWnd,&R);
                          x1=R.left;
                          y1=R.top+w;
                          x2=R.right;
                          y2=R.bottom;
 
        hChildWind_1=CreateWindow(szClassName, nameWnd[0], WS_OVERLAPPEDWINDOW | WS_POPUP,
        x1, y1, (x2-x1)/2, (y2-y1)/2,
        hWnd, NULL, hInstance, NULL);
 
        if(!hChildWind_1)
        {
                MessageBox(NULL, "Невозможно создать окно", "Ошибка!!", MB_OK);
                return 0;
        }
 
        ShowWindow(hChildWind_1, SW_SHOW);
        UpdateWindow(hChildWind_1);
 
        hChildWind_2=CreateWindow(szClassName, nameWnd[1], WS_OVERLAPPEDWINDOW | WS_POPUP,
        x1+(x2-x1)/2, y1+(y2-y1)/2, (x2-x1)/2, (y2-y1)/2,
        hWnd, NULL, hInstance, NULL);
 
        if(!hChildWind_2)
        {
                MessageBox(NULL, "Невозможно создать окно", "Ошибка!!", MB_OK);
                return 0;
        }
 
        ShowWindow(hChildWind_2, SW_SHOW);
        UpdateWindow(hChildWind_2);
 
        hChildWind_3=CreateWindow(szClassName, nameWnd[2], WS_OVERLAPPEDWINDOW | WS_POPUP,
        x1, y1+(y2-y1)/2, (x2-x1)/2, (y2-y1)/2,
        hWnd, NULL, hInstance, NULL);
 
        if(!hChildWind_3)
        {
                MessageBox(NULL, "Невозможно создать окно", "Ошибка!!", MB_OK);
                return 0;
        }
 
        ShowWindow(hChildWind_3, SW_SHOW);
        UpdateWindow(hChildWind_3);
 
        hChildWind_4=CreateWindow(szClassName, nameWnd[3], WS_OVERLAPPEDWINDOW | WS_POPUP,
        x1+(x2-x1)/2, y1, (x2-x1)/2, (y2-y1)/2,
        hWnd, NULL, hInstance, NULL);
 
        if(!hChildWind_4)
        {
                MessageBox(NULL, "Невозможно создать окно", "Ошибка!!", MB_OK);
                return 0;
        }
 
        ShowWindow(hChildWind_4, SW_SHOW);
        UpdateWindow(hChildWind_4);
 
        while(GetMessage(&Msg, NULL, 0, 0))
        {
                TranslateMessage(&Msg);
                DispatchMessage(&Msg);
        }
        return Msg.wParam;
}
LRESULT CALLBACK HelloWorldWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
        HDC hDC;
        PAINTSTRUCT PaintStuct;
        RECT Rect;
 
        switch(Message)
        {
                case WM_LBUTTONDOWN:
                        {
                        GetCursorPos(&p);
                        int xm=p.x;
                        int ym=p.y;
                        //AnsiString a,b;
                        GetWindowRect(hChildWind_1, &Rect);
                        //a=IntToStr(xm)+" "+IntToStr(ym);
                        //ShowMessage(a);
                        //b=IntToStr(Rect.left)+" "+IntToStr(Rect.right)+" "+IntToStr(Rect.top)+ " "+IntToStr(Rect.bottom);
                        //ShowMessage(b);
                        if((xm>Rect.left) && (xm<Rect.right) && (ym>Rect.top) && (ym<Rect.bottom))
                        MessageBox(NULL, nameWnd[0], "Прога №1", MB_OK);
                        GetWindowRect(hChildWind_2, &Rect);
                        if((xm>Rect.left)&&(xm<Rect.right)&&(ym>Rect.top)&&(ym<Rect.bottom))
                        MessageBox(NULL, nameWnd[1], "Прога №1", MB_OK);
                        GetWindowRect(hChildWind_3, &Rect);
                        if((xm>Rect.left)&&(xm<Rect.right)&&(ym>Rect.top)&&(ym<Rect.bottom))
                        MessageBox(NULL, nameWnd[2], "Прога №1", MB_OK);
                        GetWindowRect(hChildWind_4, &Rect);
                        if((xm>Rect.left)&&(xm<Rect.right)&&(ym>Rect.top)&&(ym<Rect.bottom))
                        MessageBox(NULL, nameWnd[3], "Прога №1", MB_OK);
                        return 0;
                        }
                case WM_DESTROY:
                         if (hWnd != hChildWind_1 && hWnd !=hChildWind_2 && hWnd !=hChildWind_3 && hWnd !=hChildWind_4)
             PostQuitMessage(0);
                         return 0;
                default:
                        return DefWindowProc(hWnd, Message, wParam, lParam);
        }
        return 0;
}
 
//---------------------------------------------------------------------------
 
 
 
Почему то кажется что я не совсем правильно сделал то, что требуется в задании. Если подскажите буду очень благодарен!!

Всего записей: 52 | Зарегистр. 12-03-2008 | Отправлено: 13:10 20-03-2008
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Djony1987
Ага, неправильно.
Я бы делал так:
1. Создал и зарегистрировал класс главного окна.
2. Создал и зарегистрировал класс вспомогательного окна (почему оно называется временным, кстати?).
3. В обработчике сообщения WM_CREATE главного окна создал бы четыре вспомогательных окна (рекомендую, кстати, для определения размеров клиентской области использовать GetClientRect - это сразу даст нужные координаты, а с GetWindowRect мороки будет куда больше ) класса из п.2 со стилем WS_CHILD (а не WS_OVERLAPPEDWINDOW и не WS_POPUP!). И задал бы каждому свой заголовок.
4. В обработчике сообщений вспомогательного окна ловил бы WM_LBUTTONDOWN, вытаскивал бы заголовок (GetWindowText) и показывал бы его.
 
Вот, слегка подкрутил исходник, для лучшего понимания.
Подробнее...

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:32 20-03-2008 | Исправлено: Abs62, 19:39 20-03-2008
Djony1987

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Спасибо большое!! Прочитал в книге что окна делятся на временные и дочерние. Поэтому наверно здесь WS_CHILD не правильно по заданию. И еще прога не работает как надо почему-то - создается главное окно и все. щелкаешь на углах - выскакивают заголовок а самих временных окон не видно...или ты так и хотел?
Много почерпнул из твоего текста...Сенк!

Всего записей: 52 | Зарегистр. 12-03-2008 | Отправлено: 06:30 21-03-2008
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Djony1987

Цитата:
Прочитал в книге что окна делятся на временные и дочерние.

Может, всё-таки всплывающие (Pop-up)?

Цитата:
Поэтому наверно здесь WS_CHILD не правильно по заданию.

Может быть, хотя всплывающие окна так использовать - извращение. Они на то и всплывающие - показал и убрал.
Ну, замени WS_CHILD на WS_POPUP. Только координаты по другому посчитать надо будет - для всплывающих окон они задаются относительно экрана, а не относительно материнского окна, насколько я помню.

Цитата:
а самих временных окон не видно...

Видно. Просто в них ничего не нарисовано, WS_BORDER не задан, WS_CAPTION тоже - вот они никак и не выделяются.

Цитата:
или ты так и хотел?

Ага.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 09:01 21-03-2008
Djony1987

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Все супер. Спасибо еще раз! Если появятся вопросы еще спрошу)

Всего записей: 52 | Зарегистр. 12-03-2008 | Отправлено: 20:30 21-03-2008
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как можно (и можно ли) определить перечень файлов, открытых данным приложением? (ProcessID,  ThreadID можно получить если надо).

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 18:05 03-04-2008
o_0



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток. Помогите пожалуйста решить проблему.Есть система с двумя мониторами. В системе 2 видеокарты. На каждой висит моник. Можно ли средствами винапи проиграть файл на одном монике причем на втором этот файл не проигрывается?  
То есть на одном монике челове работает а на другом проигрывается файл.
Спасибо большое.

Всего записей: 120 | Зарегистр. 11-07-2006 | Отправлено: 23:29 17-04-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
o_0
Насчет винапи вряд ли, тут специфика видеокарт. Но так как есть видеоплееры, которые распознают количество мониторов и могут делать вывод на одном только, то как то это можно. Вот только насчет винапи сомневаюсь, мб какое нить SDK.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:59 18-04-2008
ZONE51



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt
А можете сказать примеры таких плееров (желательно опенсурс)?

Всего записей: 884 | Зарегистр. 06-01-2006 | Отправлено: 09:27 18-04-2008
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DirectShow это SDK называется. Смотри в разделы, посвящённые перечислению имеющихся устройств (у тебя их будет более одного, если две видеокарты) и управлению оверлеями (если к одной видеокарте подключены два монитора).

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 18:25 18-04-2008 | Исправлено: Qraizer, 18:27 18-04-2008
o_0



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer
Так я нашел список мониторов не на директ х а используя простое винапи. Это все я сделал. Вопрос в том как теперь проиграть файл этот на конкретном монике. 2 видюхи по монику на каждой

Всего записей: 120 | Зарегистр. 11-07-2006 | Отправлено: 00:31 19-04-2008
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Обычно DirectShow юзает DirectDraw для вывода. Смотри интерфейсы DirectDraw для перечисления доступных устройств. Должен будешь найти 2 устройства. Как это потом связывается с DirectShow - не подскажу, не знаю.
 
P.S. Через WinAPI в том понимании, как ты это себе представляешь, видео ты в общем случае не проиграешь, т.к. кодеки могут не поддерживать интерфейс VideoForWindows, потому как он устаревший, но обязательно поддерживают DirectShow. Кроме того, DirectX уже давно стал неотделимой частью операционной системы, так что его интерфейсы без большой натяжки можно считать относящимся к WinAPI.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 16:38 19-04-2008
master20

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите лучший учебник, с кот. надо начинать изучение WinAPI
Заранее спасибо

Всего записей: 31 | Зарегистр. 05-01-2008 | Отправлено: 18:02 20-04-2008
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
master20
Начать лучше с Петзольда - "Программирование для Windows 95". Он даёт материал подробно и с самых азов. Потом стоит пройтись по Рихтеру - "Создание эффективных WIN32-приложений". Далее по потребностям.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:26 20-04-2008
master20

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Abs62
Спасибо!
Скачал Петзольда, полистал - классный учебник, а вот Рихтера че-то не хочет качать..

Всего записей: 31 | Зарегистр. 05-01-2008 | Отправлено: 23:07 20-04-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru