Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2015, 21:00   #1
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию изменение картинки по нажатии кнопки winapi

суть вопроса, при запуске приложения загружается картинка img_1, как при нажатии button сменить картинку. что надо поместить в процедуру обработки нажатия на button?

Код:
var
  button: HWND;
  bmp: hBitmap;
  dc,hMemDC: HDC;

function MessageProcess(Handle: HWND; Msg: UINT; WParam: Integer; lParam: Integer): Integer;stdcall;
var
  ps: PAINTSTRUCT;
begin
  Result:=0;
  case msg of
    WM_CREATE:
      begin
         Button:=CreateWindow('button','Кликать сюда',WS_VISIBLE or WS_CHILD or WS_CLIPSIBLINGS,6,73,110,25,Form,HBTN,hInstance,nil);

      end;
    WM_PAINT:
      begin
        dc:=GetDC(0);
        hMemDC:=CreateCompatibleDC(dc);
        bmp:=LoadImage(hInstance, PChar('C:\Pic1.bmp'), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        SelectObject(hMemDC,bmpBut);
        BeginPaint(Handle,ps);
        BitBlt(ps.hdc,414,383,34,34,hMemDC,0,0,SRCCOPY);
        EndPaint(Handle,ps);
      end;
    WM_DESTROY:
      begin
        DeleteObject(SelectObject(hMemDC,bmpBut));
        DeleteDC(hMemDC);
        ReleaseDC(0,dc);
        PostQuitMessage(0);
        Exit;
      end;
  end;
  Result:=DefWindowProc(Handle,Msg,WParam,LParam);
end;
HTTqp вне форума Ответить с цитированием
Старый 30.01.2015, 09:28   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

в начале когда кнопка создаётся, вы ей должны присвоить её код, скажем 111 Button:=CreateWindow('button','Клик ать сюда',WS_VISIBLE or WS_CHILD or WS_CLIPSIBLINGS,6,73,110,25,Form,111,hInstance,nil);

а потом в обработчике это прописать
Код:
case msg of
    111:
      begin
         //вот тут загружаем картинку и прочее что надо по задаче
      end;
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 30.01.2015, 20:06   #3
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
в начале когда кнопка создаётся, вы ей должны присвоить её код, скажем 111 Button:=CreateWindow('button','Клик ать сюда',WS_VISIBLE or WS_CHILD or WS_CLIPSIBLINGS,6,73,110,25,Form,111,hInstance,nil);

а потом в обработчике это прописать
Код:
case msg of
    111:
      begin
         //вот тут загружаем картинку и прочее что надо по задаче
      end;
вставляю вот так, но ни чего не происходит, отрисовка то идет в WM_PAint
Код:
case msg of
    111:
      begin
dc:=GetDC(0);
        hMemDC:=CreateCompatibleDC(dc);
        bmp:=LoadImage(hInstance, PChar('C:\Pic1.bmp'), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        SelectObject(hMemDC,bmpBut);
        BeginPaint(Handle,ps);
        BitBlt(ps.hdc,414,383,34,34,hMemDC,0,0,SRCCOPY);
        EndPaint(Handle,ps);
      end;
      end;
HTTqp вне форума Ответить с цитированием
Старый 30.01.2015, 20:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
bmp:=LoadImage(hInstance, PChar('C:\Pic1.bmp'), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
Убери это из WM_PAINT.
Код:
function MessageProcess(Handle: HWND; Msg: UINT; WParam: Integer; lParam: Integer): Integer;stdcall;
var
  ps: PAINTSTRUCT;
begin
  Result:=0;
  case msg of

WM_COMMAND:
if (lParam = Button) and (HiWord(wParam) = BN_CLICKED) then
  begin
   Тут этот  самый LoadImage и принудить отрисовку.
  end
;

    WM_CREATE:
      begin
        Тут не надо кнопку создавать
      end;
    WM_PAINT:
  .... Бла бла бла
Button:=CreateWindow('button'... пропиши в до основного цикла, ловящего сообщения.
Пример:
Код:
{
  Данный код был спроектирован в среде APIx - Visual WinAPI 2
  Copyright (c) PiddleSoft 2004-2006
  http://piddlesoft.narod.ru
  piddlesoft@mail.ru

  Дата генерации листинга - 30.01.2015 20:00:07
}

program APIx_Project4;

uses
  windows, messages, commctrl; //Используемые модули

// Иконка
{$R 'icon.res'}

var
  WinClass : TWndClass; //переменная класса TWndClass для создания главного окна
  hInst : HWND; //хандлер приложения
  Handle : HWND; //локальный хандлер
  Msg : TMSG; //сообщение
  hFont : HWND; //хандлер шрифта
  Button1 : HWND; //TButton

procedure ShutDown; //процедура завершения программы
begin
  DeleteObject(hFont); //удаление шрифта
  UnRegisterClass('TAPIxForm', hInst); //удаление окна
  ExitProcess(hInst); //закрытие программы
end;

function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщений
begin
  Result := DefWindowProc(hwnd, msg, wparam, lparam);
  case Msg of

WM_COMMAND:
if (lParam = Button1) and (HiWord(wParam) = BN_CLICKED) then
  //
  
  begin

  end
;

  WM_DESTROY: ShutDown;
  end;
end;

begin
hInst := GetModuleHandle(nil);
  with WinClass do
  begin
   Style := CS_PARENTDC; //стиль класса главного окна
   hIcon := LoadIcon(hInst, MAKEINTRESOURCE('APIXICON')); //иконка программы
   lpfnWndProc := @WindowProc; //назначение обработчика сообщений
   hInstance := hInst;
   hbrBackground := COLOR_BTNFACE + 1; //цвет окна
   lpszClassName := 'TAPIxForm'; //класс окна
   hCursor := LoadCursor(0, IDC_ARROW); //активный курсор
  end;
InitCommonControls;
RegisterClass(WinClass); //регистрация класса в системе

// Создание главного окна программы
Handle := CreateWindowEx(0, 'TAPIxForm', 'Форма1',
WS_OVERLAPPEDWINDOW or
WS_VISIBLE or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU,
219, 112, 550, 366,
0, 0,
hInst, nil);

// Создание шрифта
hFont := CreateFont(
-11, 0, 0, 0, 0, 0, 0, 0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');

Button1 := CreateWindow(
'Button',
'Button1', 
WS_CHILD or BS_TEXT or WS_VISIBLE, 
185, 120, 231, 121, Handle, Button1, hInst, nil);
SendMessage(Button1, WM_SETFONT, hFont, 0);


  // Цикл сбора сообщений
  while(GetMessage(Msg, 0, 0, 0)) do
  begin
    TranslateMessage(Msg); //прием сообщений
    DispatchMessage(Msg); //удаление сообщений из очереди
  end;
  end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение процедур, исполняемых при нажатии кнопки. AlexeyKrupnik Общие вопросы Delphi 2 28.04.2012 00:27
Обновление картинки при нажатии кнопки. Strangers JavaScript, Ajax 2 15.02.2012 08:12
Изменение цвета кнопки при ее нажатии RedRec Microsoft Office Excel 2 04.08.2011 09:11
Delphi7. Изменение картинки при нажатии freeeeez Помощь студентам 11 26.12.2010 11:40
Изменение свойств кнопки через WinAPI Никки Win Api 12 20.09.2009 15:01