Регистрирайте се безплатно, за да използвате услугите на сайта! | Вход
Начало Новини ИТ Работа Форум Видео Уроци Скриптове WiFi точки MyLinks Mytech Още


Нова тема
Бягащо бутонче
Тази тема е погледната 154 пъти
Добави темата към любими | Принтирай темата | Нова тема 
Публикувано на: 29.11.2008 22:33
zaikoni
Самурай

Модератор

Мнения: (240)

Знаете,че рядко пиша но наистина има проблем-това не ми е курсова
задача (Не си позволявам такива неща и не ги одобрявам :) ) просто
заниманието ми с .Net developmenta ми е едно от
хобитата,въпреки че сам на доста доста начално ниво та да попитам ако
някой има идея как да стане това:
Имам една проста Windows Form-ичка правя си едно бутонче на нея по
обичаиният начин-това което искам да направя  е когато приближа
курсора на мишката това бутонче да "бяга" и да "не позволява" да се
click-не 
Надявам се че някой ще има идея как да стане !
Поздрави!


 
Това мнение е редактирано от zaikoni на 29.11.2008 22:34
---------------------------
Потребител от: 30.01.08 | Всички уроци от zaikoni | Всички скриптове от zaikoni

Visual Studio 2008 only (to the next version :-))
напиши eMail напиши лично съобщение виж профила на zaikoni
Публикувано на: 30.11.2008 16:09
sullivan
Ронин

Мнения: (40)

Не съм много запознат със .NET даже да не кажа никак пиша предимно на C и assembler но ще се опитам да ти покажа как може да стане под C пък ти си го преобразувай за .NET. Значи в общи линии нещата стоят така създаваш си бутон в прозореца на приложението и подменияш процедурата на прозореца със такава за бутона за да може да генерира съобщения mouse move за бутона като по този начин ще прихваща когато мишката е върху бутона.Процедурата за подмяна трябва да се извика при самото създаване на прозореца на приложението по следния начин като първо си декларираш една структуа за да може с нейна помощ да подменим функцията на прозореца.
CODE
1
2
3
4
5
struct _INSBUT
{
   
WNDPROC oldproc;
};
typedef struct _INSBUT INSBUT;

след това правиш и самата подмяна в момента на създаване на прозореца

 CODE
1
2
3
4
case WM_INITDIALOG:
           
SetClassLong (hWnd, GCL_HICON, (LONG)LoadIcon(ghInstance,    TEXT("SAMPLE_ICO")));
       
InsertButton(GetDlgItem(hWnd, BUTTON_ID));
           
break;

Функцията InsertButton(GetDlgItem(hWnd, BUTTON_ID)); прави подмяната.

На бързо съм ти сглобил една малка програмка която да демонстрира използвания от мен подход.
Ами това е в общи линии не го обясних както трябва но не мога да обяснявам хубаво и други са ми го казвали за туй ще приложа кода на програмата със VC++ 6.0 ще може да си я компилираш и да разучиш кода.

CODE
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*sample.c*/
#include <windows.h>
#include "sample.h"

#define GET_X_LPARAM(lp)((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp)((int)(short)HIWORD(lp))

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   
HANDLE  hWndDialog;
   
MSG msg;

   
ghInstance = hInstance;

   
hWndDialog = CreateDialogParam (hInstance, MAKEINTRESOURCE (MAIN_DLG), NULL, (DLGPROC) SampleDlgProc, (LONG)0);

      
while (GetMessage (&msg, NULL, 0, 0))
       
if (!IsDialogMessage (hWndDialog, &msg))
            {
       
__asm
       
{
               
lea eax, msg
               
push eax
                call dword ptr TranslateMessage
                lea eax
, msg
               
push eax
                call dword ptr DispatchMessage
       
}
            }
   
DestroyWindow (hWndDialog);
   
return 0;
}

BOOL CALLBACK SampleDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
   
POINT pt;
   
RECT rcb, rcw;

       
switch (wMsg)
        {

       
case WM_INITDIALOG:
           
SetClassLong (hWnd, GCL_HICON, (LONG)LoadIcon(ghInstance, TEXT("SAMPLE_ICO")));
           
InsertButton(GetDlgItem(hWnd, BUTTON_ID));
           
break;

       
case WM_CLOSE:
           
PostQuitMessage (0);
           
break;

       
case WM_COMMAND:

           
switch (LOWORD (wParam))
                {

               
case BUTTON_ID:
                   
MessageBox(hWnd, "Аз съм бутон с икона и текст", "Бутон", MB_OK);
                   
break;
           
               
default:
                   
return FALSE;
               
}
           
break;

       
default:
           
return FALSE;
       
}

   
return TRUE;
}

BOOL InsertButton(HWND hwnd)
{
   
INSBUT *pbut;
   
pbut = HeapAlloc(GetProcessHeap(), 0, sizeof(INSBUT));
   
if(!pbut) return FALSE;
   
pbut->oldproc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)InsButProc);
   
SetWindowLong(hwnd, GWL_USERDATA, (LONG)pbut);
   
SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER);
   
return TRUE;
}

LRESULT CALLBACK InsButProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   
WNDPROC oldproc;
   
INSBUT *pbut;
   
RECT rcb, rcw;
   
pbut    = (INSBUT *)GetWindowLong(hwnd, GWL_USERDATA);
   
oldproc = pbut->oldproc;

   
switch(msg)
    {
   
case WM_NCDESTROY:
       
HeapFree(GetProcessHeap(), 0, pbut);
       
break;

   
case WM_MOUSEMOVE:
       
GetWindowRect(hwnd, &rcb);
       
GetClientRect(GetParent(hwnd), &rcw);
       
if(state ==1)
        {
           
MoveWindow(hwnd, rcw.top+5, rcw.left+10, rcb.right-rcb.left, rcb.bottom-rcb.top, TRUE);
           
state = 0;
           
break;
       
}
       
MoveWindow(hwnd, rcw.top+80, rcw.left+120, rcb.right-rcb.left, rcb.bottom-rcb.top, TRUE);
       
state = 1;
       
break;
   
default:
       
break;
   
}

   
return CallWindowProc(oldproc, hwnd, msg, wParam, lParam);
}

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*sample.h*/
int state = 1;
#define MAIN_DLG 100
#define BUTTON_ID 150
HINSTANCE ghInstance;
BOOL CALLBACK SampleDlgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK InsButProc(HWND, UINT, WPARAM, LPARAM);
BOOL InsertButton(HWND);

struct _INSBUT
{
   
WNDPROC oldproc;
};
typedef struct _INSBUT INSBUT;

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*sample.rc*/
#include <windows.h>
#include "sample.h"
SAMPLE_ICO ICON "sample.ico"
MAIN_DLG DIALOG 132, 75, 131, 78
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
STYLE DS_MODALFRAME
| WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
   
WS_SYSMENU
CAPTION
"Аз съм тестово приложение"
FONT 10, "MS Shell Dlg"
BEGIN
    GROUPBOX       
"", 201, 2, 0, 127, 75
   
PUSHBUTTON      "ОК", BUTTON_ID, 45, 52, 42, 14
END

PS. за да го компилираш си сложи в директорията една икона със следното име
sample.ico за съжаление няма как да кача кода.


 
Това мнение е редактирано от sullivan на 30.11.2008 16:09
---------------------------
Потребител от: 01.12.06 | Всички уроци от sullivan | Всички скриптове от sullivan
напиши eMail напиши лично съобщение виж профила на sullivan
Публикувано на: 30.11.2008 17:09
zaikoni
Самурай

Модератор

Мнения: (240)

@sullivan Много ти благодаря наистина и да не успея да го модифицирам
към C# (в koeto съмнявам    ) но за C# ще ми трябват още неща
мерси многогоогогог наистина за отделеното време


 
Това мнение е редактирано от zaikoni на 30.11.2008 17:10
---------------------------
Потребител от: 30.01.08 | Всички уроци от zaikoni | Всички скриптове от zaikoni

Visual Studio 2008 only (to the next version :-))
напиши eMail напиши лично съобщение виж профила на zaikoni
 1 посетител чете тази тема (0 потребители и 1 гост)  
Активни потребители: ---
   




mytech.bg © 2004 - 2009 | Контакти | За реклама