Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/40: Рейтинг темы: голосов - 40, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31

Кнопка с изображением

14.06.2017, 17:06. Показов 8730. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал окно WinApi добавил изображение, 3 кнопки, на каждую с которых нужно добавить изображение, но не знаю как
Вот код:
C++
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
#include <windows.h>
#include <gdiplus.h>
#include "resource.h"
 
#pragma comment(lib, "gdiplus.lib")
 
#define width 860
#define height 489
 
using namespace Gdiplus;
 
GdiplusStartupInput gdiStart;
ULONG_PTR gdiPlusToken;
 
TCHAR title[] = "П'яний водій";
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
 
VOID OnPaint(HDC hdc)
{
 
    Graphics graphics(hdc);
    SolidBrush brush(Color(255, 0, 0, 255));
    FontFamily fontFamily(L"Times New Roman");
    Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
    PointF pointF(850, 450);
    Bitmap* picture = Bitmap::FromResource(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDB_BITMAP1));
    
    
    graphics.DrawImage(picture, 0 , 0);
 
    
    
    delete[] picture;
 
}
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR mode, int cmd)
{
    TCHAR myClassName[] = "MyClass";    
    HWND hwnd;
    MSG msg;
    WNDCLASS wc;
    
    HWND kn1;
    HWND kn2;
    HWND kn3;
    memset(&wc, 0, sizeof(wc));
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInst;
    wc.lpszClassName = myClassName;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_HAND);
    
    RegisterClass(&wc);
    
    
    hwnd = CreateWindow(myClassName, title, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInst, NULL);
    kn1 = CreateWindow("button", "", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 315, 154, 246, 48, hwnd, (HMENU)1, hInst, NULL);
    kn2 = CreateWindow("button", "", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 315, 216, 246, 48, hwnd, (HMENU)2, hInst, NULL);
    kn3 = CreateWindow("button", "", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 315, 279, 246, 48, hwnd, (HMENU)3, hInst, NULL);
    
 
    GdiplusStartup(&gdiPlusToken, &gdiStart, NULL);
    ShowWindow(hwnd, cmd);
    
    while (GetMessage(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return EXIT_SUCCESS;
}
 
LONG WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
    HDC hdc;
    PAINTSTRUCT ps;
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case 1:
            MessageBox(hwnd, "о, привет", "Кнопка нажата", MB_OK);
            
            break;
        case 2:
            MessageBox(hwnd, "о, привет", "Кнопка нажата", MB_OK);
            break;
        case 3:
            exit(1);
        }
    
        break;
    case WM_PAINT:
    {
        hdc = BeginPaint(hwnd, &ps);
        OnPaint(hdc);
    }
    break;
 
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.06.2017, 17:06
Ответы с готовыми решениями:

Кнопка с изображением
Мне нужна кнопка с изображением.Загрузил изображение в стандартную.Но при наведении картинка с кнопки исчезает.Как назначить изображения...

кнопка с изображением
как загрузить файл чтобы на кнопке было его изображение? в книжке дан пример,(SBBrush-&gt;Gliph(&quot;4.Bmp&quot;)) но у меня прога...

Кнопка с изображением и текстом
Доброго времени суток. Задача: сделать стиль кнопок для приложения. Вместо фона кнопки использую заранее подготовленные изображения. ...

18
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
15.06.2017, 08:07
Лучший ответ Сообщение было отмечено BlackDaemon как решение

Решение

файл main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//...
#include "resource.h"
 
#define ID_BUTTON1 10011
 
HWND hbtn1;
HBITMAP hBM;
//...
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //...
    hbtn1 = CreateWindowEx(0, "BUTTON", "", BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_BITMAP, 15, 15, 40, 40, hwnd, (HMENU)ID_BUTTON1, hInstance, NULL);
    hBM = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, 0);
    SendMessage(hbtn1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBM);
    //...
}
файл recource.h:
C++
1
#define IDB_BITMAP1 1801
файл recource.rc:
C++
1
2
#include "resource.h"
IDB_BITMAP1 BITMAP "pict40x40.bmp"
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
15.06.2017, 10:16
Лучший ответ Сообщение было отмечено BlackDaemon как решение

Решение

Можно напрямую с диска брать картинку, без загрузки в ресурсы
C++
1
2
3
4
5
...
HBITMAP hBitmap = (HBITMAP) LoadImage (NULL, "E:\\img\\test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
HWND hButton = CreateWindow ("button", "test", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP, 200, 100, 50, 50, hwnd, (HMENU) 0, GetModuleHandle (NULL), NULL);
SendMessage (hButton, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
...
Или иконку можно загрузить
C++
1
2
3
4
5
...
HICON icon = LoadIcon (NULL, IDI_HAND);
HWND but = CreateWindow ("button", "test", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON, 100, 100, 50, 50, hwnd, (HMENU) 0, GetModuleHandle (NULL), NULL);
SendMessage (but, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icon);
...
0
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
15.06.2017, 10:39  [ТС]
Спасибо, если не сложно как еще можно сделать что-бы при нажатии на кнопку рисовалась картинка, а при нажатии на другую кнопку она удалялась
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
15.06.2017, 11:00
Цитата Сообщение от BlackDaemon Посмотреть сообщение
что-бы при нажатии на кнопку рисовалась картинка, а при нажатии на другую кнопку она удалялась
заменой картинок. т.е. картинка на кнопке после нажатия сменяется на другу.
ставите SendMessage(hbtn1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBM) в нужное событие, предварительно, а вместо hBM используете, например, hBM2, к которому Вы привяжете пустую или другую картинку.
1
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
15.06.2017, 11:33  [ТС]
Ну вот, мне нужно по нажатию на кнопку на окно поместить изображение, но оно почему-то не вставляется, может я записал не правильно?

C++
1
2
hBM1 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDB_BITMAP2), IMAGE_BITMAP, 0, 0, 0);
SendMessage(hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBM1);
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
15.06.2017, 12:58
C++
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
#include <windows.h>
#include <windowsx.h>
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP hBitmap, hOldBitmap;
    static BITMAP bm;
    static HDC hMemDC;
    
    switch (msg)
    {
         case WM_CREATE:
         {
              HINSTANCE hI = GetModuleHandle (NULL);
              DWORD dwButtonStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
              CreateWindow ("button", "show images", dwButtonStyle, 10, 10, 150, 20, hwnd, (HMENU) 1, hI, NULL);
              CreateWindow ("button", "hide images", dwButtonStyle, 10, 40, 150, 20, hwnd, (HMENU) 2, hI, NULL);
              hBitmap = (HBITMAP) LoadImage (NULL, "C:\\img\\test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
              GetObject (hBitmap, sizeof (BITMAP), &bm);
         }
         break;
         
         case WM_COMMAND:
         {
              switch (LOWORD (wParam))
              {
                   case 1:
                   {
                        HDC hdc = GetDC (hwnd);
                        hMemDC = CreateCompatibleDC (hdc);
                        SelectObject (hMemDC, hBitmap);
                        ReleaseDC (hwnd, hdc);
                        InvalidateRect (hwnd, NULL, TRUE);
                   }
                   break;
                   
                   case 2:
                   {
                        DeleteDC (hMemDC);
                        InvalidateRect (hwnd, NULL, TRUE);
                   }
                   break;
                   
                   default:
                        DefWindowProc (hwnd, msg, wParam, lParam);
              }
         }
         break;
         
         case WM_PAINT:
         {
              PAINTSTRUCT ps;
              HDC hdc = BeginPaint (hwnd, &ps);
              BitBlt (hdc, 10, 100, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
              EndPaint (hwnd, &ps);
         }
         break;
         
         case WM_DESTROY:
         {
              DeleteDC (hMemDC);
              PostQuitMessage (0);
         }
         break;
    }
    return DefWindowProc (hwnd, msg, wParam, lParam);
}
 
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    char Class [] = "GraphicsTest_Class";
    
    WNDCLASS wc      = {0};
    ZeroMemory (&wc, sizeof (wc) );
    
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WindowProcedure;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush (RGB (150, 150, 150));;
    wc.lpszClassName = Class;
    wc.lpszMenuName  = NULL;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    
    if (!RegisterClass (&wc))
    {
         MessageBox (NULL, "Window Registration Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    HWND hwnd = CreateWindow (Class, "GraphicsTest", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 700, 500, NULL, NULL, hInst, NULL);
    if (!hwnd)
    {
         MessageBox (NULL, "Window Creation Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    ShowWindow (hwnd, SW_SHOW);
    UpdateWindow (hwnd);
    
    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
    {
         DispatchMessage (&msg);
         TranslateMessage (&msg);
    }
    
    UnregisterClass (Class, hInst);
    return (int) msg.wParam;
}
1
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
16.06.2017, 17:27  [ТС]
ооо, спасибо огромное, только почему картинка не в начало окна вставляется?
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
16.06.2017, 17:49
Цитата Сообщение от decrement Посмотреть сообщение
C++
1
BitBlt (hdc, 10, 100, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
Вот здесь 10 - x, 100 - y, это отступ от левого верхнего края соответственно
1
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
16.06.2017, 18:18  [ТС]
а если, например хочу при нажатии на вторую кнопку не удалить изображение а изменить его?
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
16.06.2017, 19:24
Цитата Сообщение от BlackDaemon Посмотреть сообщение
не удалить изображение а изменить его
изменить на другое или изменить размер?
0
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
16.06.2017, 19:28  [ТС]
на другое, но так что бы при повторном нажатии на первую кнопку опять вывелась первая картинка и тд
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
16.06.2017, 20:12
Лучший ответ Сообщение было отмечено BlackDaemon как решение

Решение

Цитата Сообщение от BlackDaemon Посмотреть сообщение
на другое, но так что бы при повторном нажатии на первую кнопку опять вывелась первая картинка и тд
C++
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
115
116
117
118
119
120
121
122
123
124
125
#include <windows.h>
#include <windowsx.h>
 
HBITMAP hBitmap_1, hOldBitmap_1, hBitmap_2, hOldBitmap_2;
BITMAP bm;
HDC hMemDC, hMemDC_1, hMemDC_2;
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
         case WM_CREATE:
         {
              HINSTANCE hI = GetModuleHandle (NULL);
              DWORD dwButtonStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
              CreateWindow ("button", "show image 1", dwButtonStyle, 10, 10, 150, 20, hwnd, (HMENU) 1, hI, NULL);
              CreateWindow ("button", "show image 2", dwButtonStyle, 10, 40, 150, 20, hwnd, (HMENU) 2, hI, NULL);
              hBitmap_1 = (HBITMAP) LoadImage (NULL, "C:\\img\\test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
              hBitmap_2 = (HBITMAP) LoadImage (NULL, "C:\\img\\test2.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
              
              HDC hdc = GetDC (hwnd);
              hMemDC_1 = CreateCompatibleDC (hdc);
              hMemDC_2 = CreateCompatibleDC (hdc);
              SelectObject (hMemDC_1, hBitmap_1);
              SelectObject (hMemDC_2, hBitmap_2);
              ReleaseDC (hwnd, hdc);
         }
         break;
         
         case WM_COMMAND:
         {
              switch (LOWORD (wParam))
              {
                   case 1:
                   {
                        ZeroMemory (&bm, sizeof (bm));
                        GetObject (hBitmap_1, sizeof (BITMAP), &bm);
                        hMemDC = hMemDC_1;
                        InvalidateRect (hwnd, NULL, TRUE);
                   }
                   break;
                   
                   case 2:
                   {
                        ZeroMemory (&bm, sizeof (bm));
                        GetObject (hBitmap_2, sizeof (BITMAP), &bm);
                        hMemDC = hMemDC_2;
                        InvalidateRect (hwnd, NULL, TRUE);
                   }
                   break;
                   
                   default:
                        DefWindowProc (hwnd, msg, wParam, lParam);
              }
         }
         break;
         
         case WM_PAINT:
         {
              PAINTSTRUCT ps;
              HDC hdc = BeginPaint (hwnd, &ps);
              BitBlt (hdc, 10, 100, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
              EndPaint (hwnd, &ps);
         }
         break;
         
         case WM_DESTROY:
         {
              DeleteBitmap (hBitmap_1);
              DeleteBitmap (hBitmap_2);
              SelectBitmap (hMemDC_1, hOldBitmap_1);
              SelectBitmap (hMemDC_2, hOldBitmap_2);
              DeleteDC (hMemDC_1);
              DeleteDC (hMemDC_2);
              PostQuitMessage (0);
         }
         break;
    }
    return DefWindowProc (hwnd, msg, wParam, lParam);
}
 
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    char Class [] = "GraphicsTest_Class";
    
    WNDCLASS wc      = {0};
    ZeroMemory (&wc, sizeof (wc) );
    
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WindowProcedure;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush (RGB (150, 150, 150));;
    wc.lpszClassName = Class;
    wc.lpszMenuName  = NULL;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    
    if (!RegisterClass (&wc))
    {
         MessageBox (NULL, "Window Registration Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    HWND hwnd = CreateWindow (Class, "GraphicsTest", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 700, 500, NULL, NULL, hInst, NULL);
    if (!hwnd)
    {
         MessageBox (NULL, "Window Creation Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    ShowWindow (hwnd, SW_SHOW);
    UpdateWindow (hwnd);
    
    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
    {
         DispatchMessage (&msg);
         TranslateMessage (&msg);
    }
    
    UnregisterClass (Class, hInst);
    return (int) msg.wParam;
}
1
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
17.06.2017, 14:17  [ТС]
огромнейшее спасибо, еще последний вопрос если не сложно, а как можно график sin(x) нарисовать в окне winAPI? В консоле обычной могу, а тут что-то не понимаю как
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
17.06.2017, 15:57
Цитата Сообщение от BlackDaemon Посмотреть сообщение
а как можно график sin(x) нарисовать в окне winAPI?
Немножко позже сделаю, а то сейчас нету времени.

Добавлено через 1 час 28 минут
Цитата Сообщение от BlackDaemon Посмотреть сообщение
а как можно график sin(x) нарисовать в окне winAPI?
C++
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <windows.h>
#include <windowsx.h>
#include <cmath>
 
inline void draw_line (HDC hdc, int x0, int y0, int x1, int y1)
{
    MoveToEx (hdc, x0, y0, NULL);
    LineTo (hdc, x1, y1);
}
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HFONT hFontMini, hFontBig;
    switch (msg)
    {
         case WM_CREATE:
         {
              LOGFONT lf;
              ZeroMemory (&lf, sizeof (lf));
              lf.lfHeight = 13;
              hFontMini = CreateFontIndirect (&lf);
              lf.lfHeight = 30;
              hFontBig = CreateFontIndirect (&lf);
         }
         break;
         
         case WM_PAINT:
         {
              PAINTSTRUCT ps;
              HDC hdc = BeginPaint (hwnd, &ps);
              
              SetBkMode (hdc, TRANSPARENT);
              SelectFont (hdc, hFontMini);
              
              const int X0 = 400, Y0 = 200;
              const int size = 30;
              
              char temp [3] = {'\0'};
              int k = 0;
              
              // x
              draw_line (hdc, X0-350, Y0, X0+350, Y0);
              for (int x = X0; x < X0+350; x += size)
              {
                   draw_line (hdc, x, Y0-4, x, Y0+5);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, x, Y0+5, temp, strlen (temp));
                   k ++;
              }
              k = 0;
              for (int x = X0; x > X0-350; x -= size)
              {
                   draw_line (hdc, x, Y0-4, x, Y0+5);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, x, Y0+5, temp, strlen (temp));
                   k --;
              }
              
              // y
              draw_line (hdc, X0, Y0-100, X0, Y0 + 100);
              k = 0;
              for (int y = Y0; y < Y0+100; y += size)
              {
                   draw_line (hdc, X0-4, y, X0+5, y);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, X0+5, y-5, temp, strlen (temp));
                   k --;
              }
              k = 0;
              for (int y = Y0; y > Y0-100; y -= size)
              {
                   draw_line (hdc, X0-4, y, X0+5, y);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, X0+5, y-5, temp, strlen (temp));
                   k ++;
              }
              
              for (double x = -10.0; x < 10.0; x +=0.01)
                   SetPixel (hdc, int (X0 + x*size), int (Y0 + -sin(x)*size), 0xffffff);
              
              SelectFont (hdc, hFontBig);
              char text [] = "function y = sin (x), in the interval [-10; 10]";
              TextOut (hdc, 150, 10, text, strlen (text));
              EndPaint (hwnd, &ps);
         }
         break;
         
         case WM_DESTROY:
         {
              DeleteFont (hFontMini);
              DeleteFont (hFontBig);
              PostQuitMessage (0);
         }
         break;
    }
    return DefWindowProc (hwnd, msg, wParam, lParam);
}
 
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    char Class [] = "sin(x)_Class";
    
    WNDCLASS wc      = {0};
    ZeroMemory (&wc, sizeof (wc) );
    
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WindowProcedure;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush (RGB (150, 150, 150));;
    wc.lpszClassName = Class;
    wc.lpszMenuName  = NULL;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    
    if (!RegisterClass (&wc))
    {
         MessageBox (NULL, "Window Registration Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    HWND hwnd = CreateWindow (Class, "sin(x)", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 400, NULL, NULL, hInst, NULL);
    if (!hwnd)
    {
         MessageBox (NULL, "Window Creation Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    ShowWindow (hwnd, SW_SHOW);
    ShowCursor (SW_SHOW);
    UpdateWindow (hwnd);
    
    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
    {
         DispatchMessage (&msg);
         TranslateMessage (&msg);
    }
    
    UnregisterClass (Class, hInst);
    return (int) msg.wParam;
}
1
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
17.06.2017, 16:01  [ТС]
можно узнать где вы учились программированию на winapi?По учебникам каким или как?
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
17.06.2017, 16:24
Цитата Сообщение от BlackDaemon Посмотреть сообщение
можно узнать где вы учились программированию на winapi?
Дома на диване с бутылкой пива
Цитата Сообщение от BlackDaemon Посмотреть сообщение
По учебникам каким или как?
По разному: и по учебникам, и по справкам с msdn, на форумах многому научили. И всё время пишу разные приложение для оттачивания навыков программирования
1
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 31
17.06.2017, 21:15  [ТС]
извините еще раз, но появилась еще одна проблемка, а можно ли задать, что-бы например при процессе рисования вот того графика, что вы скидывали при достижении точки по х=-3, при у>0 у=1, а при у<0 у=-2. Вот на изображении пример
Изображения
 
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
18.06.2017, 13:48
Цитата Сообщение от BlackDaemon Посмотреть сообщение
извините еще раз, но появилась еще одна проблемка, а можно ли задать, что-бы например при процессе рисования вот того графика, что вы скидывали при достижении точки по х=-3, при у>0 у=1, а при у<0 у=-2. Вот на изображении пример
Позже сделаю

Добавлено через 15 часов 35 минут
C++
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <windows.h>
#include <windowsx.h>
#include <cmath>
 
inline void draw_line (HDC hdc, int x0, int y0, int x1, int y1)
{
    MoveToEx (hdc, x0, y0, NULL);
    LineTo (hdc, x1, y1);
}
 
void DrawBezier4 (HDC hdc, int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
    float t = 0.0;
    while (t <= 1)
    {
         float q1 = t*t*t*t*1 + t*t*t*(-4) + t*t*6 + t*(-4) + 1;
         float q2 = t*t*t*t*(-4) + t*t*t*12 + t*t*(-12) + t*4;
         float q3 = t*t*t*t*6 + t*t*t*(-12) + t*t*6;
         float q4 = t*t*t*t*(-4) + t*t*t*4;
         float q5 = t*t*t*t*1;
         
         float x = q1*x0 + q2*x1 + q3*x2 + q4*x3 + q5*x4;
         float y = q1*y0 + q2*y1 + q3*y2 + q4*y3 + q5*y4;
         
         SetPixel (hdc, int (x), int (y), 0xffffff);
         t += 0.0001;
    }
}
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HFONT hFontMini;
    switch (msg)
    {
         case WM_CREATE:
         {
              LOGFONT lf;
              ZeroMemory (&lf, sizeof (lf));
              lf.lfHeight = 13;
              hFontMini = CreateFontIndirect (&lf);
         }
         break;
         
         case WM_PAINT:
         {
              PAINTSTRUCT ps;
              HDC hdc = BeginPaint (hwnd, &ps);
              
              SetBkMode (hdc, TRANSPARENT);
              SelectFont (hdc, hFontMini);
              
              const int X0 = 400, Y0 = 200;
              const int size = 30;
              
              char temp [3] = {'\0'};
              int k = 0;
              
              // x
              draw_line (hdc, X0-350, Y0, X0+350, Y0);
              for (int x = X0; x < X0+350; x += size)
              {
                   draw_line (hdc, x, Y0-4, x, Y0+5);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, x, Y0+5, temp, strlen (temp));
                   k ++;
              }
              k = 0;
              for (int x = X0; x > X0-350; x -= size)
              {
                   draw_line (hdc, x, Y0-4, x, Y0+5);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, x, Y0+5, temp, strlen (temp));
                   k --;
              }
              
              // y
              draw_line (hdc, X0, Y0-100, X0, Y0 + 100);
              k = 0;
              for (int y = Y0; y < Y0+100; y += size)
              {
                   draw_line (hdc, X0-4, y, X0+5, y);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, X0+5, y-5, temp, strlen (temp));
                   k --;
              }
              k = 0;
              for (int y = Y0; y > Y0-100; y -= size)
              {
                   draw_line (hdc, X0-4, y, X0+5, y);
                   wsprintf (temp, "%d", k);
                   if (k != 0)
                        TextOut (hdc, X0+5, y-5, temp, strlen (temp));
                   k ++;
              }
              
              DrawBezier4 (hdc, 305, 100,
                                320, 680,
                                403, -490,
                                480, 680,
                                495, 100);
              EndPaint (hwnd, &ps);
         }
         break;
         
         case WM_DESTROY:
         {
              DeleteFont (hFontMini);
              PostQuitMessage (0);
         }
         break;
    }
    return DefWindowProc (hwnd, msg, wParam, lParam);
}
 
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    char Class [] = "sin(x)_Class";
    
    WNDCLASS wc      = {0};
    ZeroMemory (&wc, sizeof (wc) );
    
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WindowProcedure;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush (RGB (150, 150, 150));;
    wc.lpszClassName = Class;
    wc.lpszMenuName  = NULL;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    
    if (!RegisterClass (&wc))
    {
         MessageBox (NULL, "Window Registration Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    HWND hwnd = CreateWindow (Class, "sin(x)", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 400, NULL, NULL, hInst, NULL);
    if (!hwnd)
    {
         MessageBox (NULL, "Window Creation Failed!", "Error!", MB_OK | MB_ICONERROR);
         return 0;
    }
    
    ShowWindow (hwnd, SW_SHOW);
    ShowCursor (SW_SHOW);
    UpdateWindow (hwnd);
    
    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
    {
         DispatchMessage (&msg);
         TranslateMessage (&msg);
    }
    
    UnregisterClass (Class, hInst);
    return (int) msg.wParam;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.06.2017, 13:48
Помогаю со студенческими работами здесь

Кнопка с изображением и текстом
Что-то не могу разобраться как сделать кнопку, фон которой изображение? Делаю так &lt;button type=&quot;button&quot;...

Slick - кнопка "предыдущее изображение" скрывается под изображением
Так оно и выглядит - кнопка &quot;назад&quot; скрывается под изображением, с кнопкой &quot;вперед&quot; - все ок. В чем может быть косяк? Никакие свойства...

Не могу поставить подпись под изображением и над изображением, и как изображение разместить в центре страницы
Вот сам код и скриншот что нужно сделать &lt;!DOCTYPE HTML PUBLIC &quot;-/W3C//DTD HTML 4.01 Transitional//EN&quot; ...

Как сделать что бы кнопка добавилась, а предыдущая кнопка не исчезла с страницы?
Как сделать что бы кнопка3 добавилась, а кнопка2 не исчезла с страницы? &lt;?php if (isset($_POST)) echo...

Как сделать что бы кнопка добавилась, а предыдущая кнопка не исчезла с страницы?
Добрый день. Есть кнопка1, которая добавляет кнопку2, следующая в свою очередь создает кнопку3. Вопрос. Как сделать что бы кнопка3...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru