Wanna be serious
586 / 473 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
1

Перенос исходного кода из Assembler на C++

25.10.2017, 15:49. Показов 1474. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток форумчане!

Столкнулся с проблемой переноса кода на C++. По заданию, имеется исходный код на языке Assembler. Необходимо
перенести исходный код на C++. В результате, должна получить программа использующая WinAPI, отрисовывающая
окно, и несколько линий.

В принципе код я перенес, компиляция происходит без ошибок, однако окно не появляется. Подозревал что не правильно
отрабатывает функция создания и показа окна, но видимо это не так
Исходный код программы на языке Assembler

Assembler
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
        include \masm32\include\windows.inc
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\gdi32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\gdi32.lib
    
    
        WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
        WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
        TopXY PROTO :DWORD,:DWORD
 
        RoundedPath PROTO :DWORD
        MiteredPath PROTO :DWORD
        BeveledPath PROTO :DWORD
 
    
.data
        hInstance     dd 0
        hWnd          dd 0
        hPen          dd 0
        oldPen        dd 0
 
        szClassName   db "GDIPathsClass",0
        szDisplayName db "GDI Paths",0
 
        PathRound     db "Rounded Path",0
        PathMiter     db "Mitered Path",0
        PathBevel     db "Beveled Path",0
    
.code
    
start:
    invoke GetModuleHandle,0
    mov hInstance,eax
    invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
    invoke ExitProcess,eax
 
WinMain proc hInst:DWORD, hPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
 
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL Wwd:DWORD
        LOCAL Wht:DWORD
        LOCAL Wtx:DWORD
        LOCAL Wty:DWORD
 
        mov wc.cbSize,sizeof WNDCLASSEX
        mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
        mov wc.lpfnWndProc,OFFSET WndProc
        mov wc.cbClsExtra,0
        mov wc.cbWndExtra,0
        mov eax,hInst
        mov wc.hInstance,eax
        mov wc.hbrBackground,COLOR_WINDOW+1
        mov wc.lpszMenuName,0
        mov wc.lpszClassName,OFFSET szClassName
        invoke LoadIcon,hInst,500
        mov wc.hIcon,eax
        invoke LoadCursor,0,IDC_ARROW
        mov wc.hCursor,eax
        mov wc.hIconSm,0
 
        invoke RegisterClassEx,ADDR wc
 
        mov Wwd,500
        mov Wht,350
        invoke GetSystemMetrics,SM_CXSCREEN
        invoke TopXY,Wwd,eax
        mov Wtx,eax
        invoke GetSystemMetrics,SM_CYSCREEN
        invoke TopXY,Wht,eax
        mov Wty,eax
 
        invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
                              ADDR szClassName,
                              ADDR szDisplayName,
                              WS_OVERLAPPEDWINDOW,
                              Wtx,Wty,Wwd,Wht,
                              0,0,
                              hInst,0
        mov   hWnd,eax
 
        invoke ShowWindow,hWnd,SW_SHOWNORMAL
        invoke UpdateWindow,hWnd
 
    StartLoop:
      invoke GetMessage,ADDR msg,0,0,0
      cmp eax,0
      je ExitLoop
      invoke TranslateMessage,ADDR msg
      invoke DispatchMessage,ADDR msg
      jmp StartLoop
    ExitLoop:
      
      mov eax,msg.wParam 
      ret
 
WinMain endp
 
WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
 
    LOCAL hDC:DWORD
    LOCAL rct:RECT
    LOCAL ps:PAINTSTRUCT
 
        .if uMsg == WM_COMMAND
 
        .elseif uMsg == WM_CREATE
 
        .elseif uMsg == WM_PAINT
                invoke BeginPaint,hWin,ADDR ps
                mov hDC,eax
                ;-----------------------------------
                invoke SetMapMode,hDC,MM_ANISOTROPIC
                invoke SetWindowExtEx,hDC,100,100,0
                invoke GetClientRect,hWin,ADDR rct
                invoke SetViewportExtEx,hDC,rct.right,rct.bottom,0
                ;-------------------------------------------------
                invoke RoundedPath,hDC 
                invoke MiteredPath,hDC 
                invoke BeveledPath,hDC 
                ;-------------------
                invoke EndPaint,hWin,ADDR ps 
                xor eax,eax
                ret
 
        .elseif uMsg == WM_CLOSE
 
        .elseif uMsg == WM_DESTROY
                invoke PostQuitMessage,0
                xor eax,eax
                ret
        .endif
 
        invoke DefWindowProc,hWin,uMsg,wParam,lParam
        ret
 
WndProc endp
 
RoundedPath proc hDC:DWORD
 
    LOCAL lb:LOGBRUSH
 
        mov lb.lbStyle,BS_SOLID
        mov lb.lbColor,00000FFh
        mov lb.lbHatch,0
        invoke ExtCreatePen,PS_SOLID or PS_GEOMETRIC or PS_ENDCAP_ROUND or PS_JOIN_ROUND,10,ADDR lb,0,0
        mov hPen,eax
        invoke SelectObject,hDC,hPen
        mov oldPen,eax
        ;-------------------
        ; Build the GDI Path
        ;-------------------
        invoke BeginPath,hDC
        invoke MoveToEx,hDC,10,25,0
        invoke LineTo,hDC,20,75
        invoke LineTo,hDC,30,25
        invoke EndPath,hDC
        ;----------------------
        ; Render the built Path
        ;----------------------
        invoke StrokePath,hDC
        invoke DeleteObject,hPen
        ;---------------------------------
        ; Draw black lines inside the Path
        ;---------------------------------
        invoke GetStockObject,BLACK_PEN
        invoke SelectObject,hDC,eax 
        invoke MoveToEx,hDC,10,25,0
        invoke LineTo,hDC,20,75
        invoke LineTo,hDC,30,25
        ;--------------------------
        ; Describe the type of Path
        ;--------------------------
        invoke TextOut,hDC,11,10,ADDR PathRound,12
        invoke SelectObject,hDC,oldPen 
        ret
 
RoundedPath endp
 
MiteredPath proc hDC:DWORD
 
    LOCAL lb:LOGBRUSH
 
        mov lb.lbStyle,BS_SOLID
        mov lb.lbColor,000FF00h
        mov lb.lbHatch,0
        invoke ExtCreatePen,PS_SOLID or PS_GEOMETRIC or PS_ENDCAP_FLAT or PS_JOIN_MITER,10,ADDR lb,0,0
        mov hPen,eax
        invoke SelectObject,hDC,hPen
        mov oldPen,eax
        ;-------------------
        ; Build the GDI Path
        ;-------------------
        invoke BeginPath,hDC
        invoke MoveToEx,hDC,40,25,0
        invoke LineTo,hDC,50,75
        invoke LineTo,hDC,60,25
        invoke EndPath,hDC
        ;----------------------
        ; Render the built path
        ;----------------------
        invoke StrokePath,hDC
        invoke DeleteObject,hPen
        ;---------------------------------
        ; Draw black lines inside the Path
        ;---------------------------------
        invoke GetStockObject,BLACK_PEN
        invoke SelectObject,hDC,eax 
        invoke MoveToEx,hDC,40,25,0
        invoke LineTo,hDC,50,75
        invoke LineTo,hDC,60,25
        ;--------------------------
        ; Describe the type of Path
        ;--------------------------
        invoke TextOut,hDC,41,10,ADDR PathMiter,12
        invoke SelectObject,hDC,oldPen 
        ret
 
MiteredPath endp
 
BeveledPath proc hDC:DWORD
 
    LOCAL lb:LOGBRUSH
 
        mov lb.lbStyle,BS_SOLID
        mov lb.lbColor,0FF0000h
        mov lb.lbHatch,0
        invoke ExtCreatePen,PS_SOLID or PS_GEOMETRIC or PS_ENDCAP_SQUARE or PS_JOIN_BEVEL,10,ADDR lb,0,0
        mov hPen,eax
        invoke SelectObject,hDC,hPen
        mov oldPen,eax
        ;-------------------
        ; Build the GDI Path
        ;-------------------
        invoke BeginPath,hDC
        invoke MoveToEx,hDC,70,25,0
        invoke LineTo,hDC,80,75
        invoke LineTo,hDC,90,25
        invoke EndPath,hDC
        ;----------------------
        ; Render the built Path
        ;----------------------
        invoke StrokePath,hDC
        invoke DeleteObject,hPen
        ;---------------------------------
        ; Draw black lines inside the Path
        ;---------------------------------
        invoke GetStockObject,BLACK_PEN
        invoke SelectObject,hDC,eax 
        invoke MoveToEx,hDC,70,25,0
        invoke LineTo,hDC,80,75
        invoke LineTo,hDC,90,25
        ;--------------------------
        ; Describe the type of Path
        ;--------------------------
        invoke TextOut,hDC,71,10,ADDR PathBevel,12
        invoke SelectObject,hDC,oldPen 
        ret
 
BeveledPath endp
 
TopXY proc wDim:DWORD, sDim:DWORD
 
    shr sDim,1
    shr wDim,1
    mov eax,wDim
    sub sDim,eax
    mov eax,sDim
    ret
 
TopXY endp
 
end start


Исходный код программы на C++

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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "resource.h"
 
#define TEST_WM_001   102
#pragma warning (disable : 4996)
 
LPPAINTSTRUCT ps;
HWND hWnd;
HPEN hPen;
LPRECT rct;
HDC hDc;
LOGBRUSH lb;
HGDIOBJ oldPen;
 
char szClassName[] = "GDIPathsClass";
char szDisplayName[] = "GDI Paths";
 
char PathRound[] = "Закругленный путь";
char PathMiter[] = "Перемежный путь";
char PathBevel[] = "Распущенный путь";
 
HINSTANCE ghInstance;   // Переменная для хранения хендела процесса                      
                              // Описание используемой оконной процедуры
BOOL CALLBACK PviewDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
 
int RoundedPath(HDC hDc);
int MiteredPath(HDC hDc);
int BeveledPath(HDC hDc);
int TopXY(DWORD wDim, DWORD sDim);
int WINAPI WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam);
 
// Главное приложение программы
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    int Wwd;
    int Wht;
    int Wtx;
    int Wty;
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW || CS_VREDRAW || CS_BYTEALIGNWINDOW;
    //wc.lpfnWndProc = PviewDlgProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
    wc.lpszMenuName = 0;
    wc.lpszClassName = szClassName;
 
    HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
    //SendMessage(hWnd, WM_SETICON, 1, (LPARAM)hIcon);
 
    LoadIcon(hInstance, (LPCSTR)IDI_ICON1);
    wc.hIcon = hIcon;
    LoadCursor(0, IDC_ARROW);
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
 
    Wwd = 500;
    Wht = 350;
    GetSystemMetrics(SM_CXSCREEN);
    TopXY(Wwd, Wht);
    Wtx = Wht;
    GetSystemMetrics(SM_CYSCREEN);
    TopXY(Wht, Wht);
    Wty = Wht;
 
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szClassName, szDisplayName, WS_OVERLAPPEDWINDOW, Wtx, Wty, Wwd, Wht, 0, 0, hInstance, 0);
 
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);
 
    HWND hWndDialog = hWnd;
    MSG msg;
 
    ghInstance = hInstance;
    // Создание  диалогового окна
    //hWndDialog = CreateDialogParam(hInstance,
    //  MAKEINTRESOURCE(IDD_DIALOG1),
    //  NULL,
    //  (DLGPROC)PviewDlgProc,
    //  (LONG)0);
    //// Стандартный цикл обработки сообщений приложения
    while (GetMessage(&msg, NULL, 0, 0))
        if (!IsDialogMessage(hWndDialog, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    DestroyWindow(hWndDialog);
 
    return 0;
}
 
int WINAPI WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    switch (wMsg)
    {
        // Сообщение о инициализации диалогового окна
    case WM_INITDIALOG:
 
        break;
 
    case WM_PAINT:
        BeginPaint(hWnd, ps);
        SetMapMode(hDc, MM_ANISOTROPIC);
        SetWindowExtEx(hDc, 100, 100, 0);
        GetClientRect(hWnd, rct);
        SetViewportExtEx(hDc, rct->right, rct->bottom, 0);
 
        RoundedPath(hDc);
        MiteredPath(hDc);
        BeveledPath(hDc);
 
        EndPaint(hWnd, ps);
 
        // Сообщение о закрытии диалогового окна
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
 
    default:
        return FALSE;
    }
    DefWindowProc(hWnd, wMsg, wParam, lParam);
 
    return TRUE;
}
 
//Процедура обработки сообщений диалогового окна
BOOL CALLBACK PviewDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    switch (wMsg)
    {
        // Сообщение о инициализации диалогового окна
    case WM_INITDIALOG:
 
        break;
 
    case WM_PAINT:
        BeginPaint(hWnd, ps);
        SetMapMode(hDc, MM_ANISOTROPIC);
        SetWindowExtEx(hDc, 100, 100, 0);
        GetClientRect(hWnd, rct);
        SetViewportExtEx(hDc, rct->right, rct->bottom, 0);
 
        RoundedPath(hDc);
        MiteredPath(hDc);
        BeveledPath(hDc);
 
        EndPaint(hWnd, ps);
 
        // Сообщение о закрытии диалогового окна
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
 
    default:
        return FALSE;
    }
    //DefWindowProc(hWnd, wMsg, wParam, lParam);
 
    return TRUE;
}
 
int RoundedPath(HDC hDc)
{
    lb.lbStyle = BS_SOLID;
    lb.lbColor = BLACK_BRUSH;
    lb.lbHatch = 0;
 
    ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_ROUND || PS_JOIN_ROUND, 10, &lb, 0, 0);
    SelectObject(hDc, hPen);
    BeginPath(hDc);
    MoveToEx(hDc, 10, 25, 0);
    LineTo(hDc, 20, 75);
    LineTo(hDc, 30, 25);
    EndPath(hDc);
 
    StrokePath(hDc);
    DeleteObject(hPen);
    GetStockObject(BLACK_PEN);
    SelectObject(hDc, oldPen);
    MoveToEx(hDc, 10, 25, 0);
    LineTo(hDc, 20, 75);
    LineTo(hDc, 30, 25);
    TextOut(hDc, 11, 10, PathRound, 12);
    SelectObject(hDc, oldPen);
 
    return TRUE;
}
 
int MiteredPath(HDC hDc)
{
    lb.lbStyle = BS_SOLID;
    lb.lbColor = BLACK_BRUSH;
    lb.lbHatch = 0;
 
    ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_FLAT || PS_JOIN_MITER, 10, &lb, 0, 0);
    SelectObject(hDc, hPen);
 
    BeginPath(hDc);
    MoveToEx(hDc, 40, 25, 0);
    LineTo(hDc, 50, 75);
    LineTo(hDc, 60, 25);
    EndPath(hDc);
 
    StrokePath(hDc);
    DeleteObject(hPen);
 
    GetStockObject(BLACK_PEN);
    SelectObject(hDc, oldPen);
    MoveToEx(hDc, 40, 25, 0);
    LineTo(hDc, 50, 75);
    LineTo(hDc, 60, 25);
 
    TextOut(hDc, 41, 10, PathMiter, 12);
    SelectObject(hDc, oldPen);
 
    return TRUE;
}
 
int BeveledPath(HDC hDc)
{
    lb.lbStyle = BS_SOLID;
    lb.lbColor = BLACK_BRUSH;
    lb.lbHatch = 0;
 
    ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_FLAT || PS_JOIN_MITER, 10, &lb, 0, 0);
    SelectObject(hDc, hPen);
 
    BeginPath(hDc);
    MoveToEx(hDc, 70, 25, 0);
    LineTo(hDc, 80, 75);
    LineTo(hDc, 90, 25);
    EndPath(hDc);
 
    StrokePath(hDc);
    DeleteObject(hPen);
 
    GetStockObject(BLACK_PEN);
    SelectObject(hDc, oldPen);
    MoveToEx(hDc, 70, 25, 0);
    LineTo(hDc, 80, 75);
    LineTo(hDc, 90, 25);
 
    TextOut(hDc, 71, 10, PathBevel, 12);
    SelectObject(hDc, oldPen);
 
    return TRUE;
}
 
int TopXY(DWORD wDim, DWORD sDim)
{
    sDim = sDim << 1;
    wDim = wDim << 1;
    return sDim -= wDim;
}


Программа должна иметь следующий вид:
Перенос исходного кода из Assembler на C++


Подскажите пожалуйста, в чем может быть проблема?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2017, 15:49
Ответы с готовыми решениями:

Перенос исходного кода из Assembler на C++
Доброго времени суток форумчане! Столкнулся с проблемой переноса кода на C++. По заданию,...

Редактор исходного кода / Перенос длинных строк
Подскажите, как ограничить длину строки в редакторе исходного кода ? Чтобы текст не уползал вправо...

Реализовать 2 статических анализатора исходного кода, которые будут проверять правила оформления кода
Доброго времени суток. Уже читал подобную пост здесь &quot;Парсер С++&quot;, но немного не то. Задача:...

Перенос из real в integer Assembler
Здравствуйте. Если, к примеру, получил целое число 2 в real, как перенести это число в integer....

4
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
25.10.2017, 17:13 2
lpfnWndProc почему не задаётся?
0
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
25.10.2017, 17:17 3
Код на плюсах получился такой же по размеру, как код на ассемблере.
1
127 / 126 / 59
Регистрация: 22.01.2014
Сообщений: 462
25.10.2017, 17:19 4
Лучший ответ Сообщение было отмечено Bespridelschic как решение

Решение

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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
//#include "resource.h"
 
 
#define TEST_WM_001   102
#pragma warning (disable : 4996)
 
LPPAINTSTRUCT ps;
HWND hWnd;
HPEN hPen;
LPRECT rct;
HDC hDc;
LOGBRUSH lb;
HGDIOBJ oldPen;
 
char szClassName[] = "GDIPathsClass";
char szDisplayName[] = "GDI Paths";
 
char PathRound[] = "Закругленный путь";
char PathMiter[] = "Перемежный путь";
char PathBevel[] = "Распущенный путь";
 
HINSTANCE ghInstance;   // Переменная для хранения хендела процесса                      
                              // Описание используемой оконной процедуры
BOOL CALLBACK PviewDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
 
int RoundedPath(HDC hDc);
int MiteredPath(HDC hDc);
int BeveledPath(HDC hDc);
int TopXY(DWORD wDim, DWORD sDim);
//int WINAPI WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT
 /*WINAPI*/ CALLBACK WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam);
// Главное приложение программы
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    int Wwd;
    int Wht;
    int Wtx;
    int Wty;
    int err;
    memset(&wc,0,sizeof(wc));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW || CS_VREDRAW || CS_BYTEALIGNWINDOW;
    //wc.lpfnWndProc = PviewDlgProc;
    wc.lpfnWndProc =WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    //wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
    wc.hbrBackground =(HBRUSH)(COLOR_3DFACE + 1);//NULL;
    wc.lpszMenuName = 0;
    wc.lpszClassName = szClassName;
 
    //HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
    //SendMessage(hWnd, WM_SETICON, 1, (LPARAM)hIcon);
 
    //LoadIcon(hInstance, (LPCSTR)IDI_ICON1);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);;//hIcon;
    wc.hCursor=LoadCursor(0, IDC_ARROW);
    wc.hIconSm = 0;
    
 
    if (0==RegisterClassEx(&wc)){
        int code=GetLastError();
        MessageBoxA(NULL, "Error! RegisterClassEx!","Error!",MB_ICONERROR |MB_OK);
        return code;
    };
 
    Wwd = 500;
    Wht = 350;
    GetSystemMetrics(SM_CXSCREEN);
    TopXY(Wwd, Wht);
    Wtx = Wht;
    GetSystemMetrics(SM_CYSCREEN);
    TopXY(Wht, Wht);
    Wty = Wht;
 
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szClassName, szDisplayName, WS_OVERLAPPEDWINDOW, Wtx, Wty, Wwd, Wht, 0, 0, hInstance, 0);
    if (hWnd==NULL){
        err=GetLastError();
        MessageBoxA(NULL, "Error! CreateWindowEx","Error!",MB_ICONERROR |MB_OK);
        return err;
    }
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);
 
    HWND hWndDialog = hWnd;
    MSG msg;
 
    ghInstance = hInstance;
    // Создание  диалогового окна
    //hWndDialog = CreateDialogParam(hInstance,
    //  MAKEINTRESOURCE(IDD_DIALOG1),
    //  NULL,
    //  (DLGPROC)PviewDlgProc,
    //  (LONG)0);
    //// Стандартный цикл обработки сообщений приложения
    while (GetMessage(&msg, NULL, 0, 0))
        //if (!IsDialogMessage(hWndDialog, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    DestroyWindow(hWndDialog);
 
    return 0;
}
 
LRESULT
 /*WINAPI*/ CALLBACK WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps2;
    //#undef RECT
    RECT rect;
    //printf("\nIn wndProc!%u",(unsigned)wMsg);
    //if (wMsg==WM_NCCREATE)return TRUE;
    //return DefWindowProc(hWnd, wMsg, wParam, lParam);
    switch (wMsg)
    {
    case WM_NCCREATE:
        return TRUE;
    // Сообщение о инициализации диалогового окна
    case WM_INITDIALOG:
 
        break;
 
    case WM_PAINT:
        //return DefWindowProc(hWnd, wMsg, wParam, lParam);
        hDc=BeginPaint(hWnd, &ps2);
        SetMapMode(hDc, MM_ANISOTROPIC);
        SetWindowExtEx(hDc, 100, 100, 0);
        GetClientRect(hWnd, &rect);
        SetViewportExtEx(hDc, rect.right, rect.bottom, 0);
 
        RoundedPath(hDc);
        MiteredPath(hDc);
        BeveledPath(hDc);
 
        EndPaint(hWnd, ps);
        break;
        // Сообщение о закрытии диалогового окна
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
 
    default:
        //return FALSE;
        return DefWindowProc(hWnd, wMsg, wParam, lParam);
    }
    //DefWindowProc(hWnd, wMsg, wParam, lParam);
 
    return TRUE;
}
 
//Процедура обработки сообщений диалогового окна
BOOL CALLBACK PviewDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    switch (wMsg)
    {
        // Сообщение о инициализации диалогового окна
    case WM_INITDIALOG:
 
        break;
 
    case WM_PAINT:
        BeginPaint(hWnd, ps);
        SetMapMode(hDc, MM_ANISOTROPIC);
        SetWindowExtEx(hDc, 100, 100, 0);
        GetClientRect(hWnd, rct);
        SetViewportExtEx(hDc, rct->right, rct->bottom, 0);
 
        RoundedPath(hDc);
        MiteredPath(hDc);
        BeveledPath(hDc);
 
        EndPaint(hWnd, ps);
 
        // Сообщение о закрытии диалогового окна
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
 
    default:
        return FALSE;
    }
    //DefWindowProc(hWnd, wMsg, wParam, lParam);
 
    return TRUE;
}
 
int RoundedPath(HDC hDc)
{
    lb.lbStyle = BS_SOLID;
    lb.lbColor = BLACK_BRUSH;
    lb.lbHatch = 0;
 
    ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_ROUND || PS_JOIN_ROUND, 10, &lb, 0, 0);
    SelectObject(hDc, hPen);
    BeginPath(hDc);
    MoveToEx(hDc, 10, 25, 0);
    LineTo(hDc, 20, 75);
    LineTo(hDc, 30, 25);
    EndPath(hDc);
 
    StrokePath(hDc);
    DeleteObject(hPen);
    GetStockObject(BLACK_PEN);
    SelectObject(hDc, oldPen);
    MoveToEx(hDc, 10, 25, 0);
    LineTo(hDc, 20, 75);
    LineTo(hDc, 30, 25);
    TextOut(hDc, 11, 10, PathRound, 12);
    SelectObject(hDc, oldPen);
 
    return TRUE;
}
 
int MiteredPath(HDC hDc)
{
    lb.lbStyle = BS_SOLID;
    lb.lbColor = BLACK_BRUSH;
    lb.lbHatch = 0;
 
    ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_FLAT || PS_JOIN_MITER, 10, &lb, 0, 0);
    SelectObject(hDc, hPen);
 
    BeginPath(hDc);
    MoveToEx(hDc, 40, 25, 0);
    LineTo(hDc, 50, 75);
    LineTo(hDc, 60, 25);
    EndPath(hDc);
 
    StrokePath(hDc);
    DeleteObject(hPen);
 
    GetStockObject(BLACK_PEN);
    SelectObject(hDc, oldPen);
    MoveToEx(hDc, 40, 25, 0);
    LineTo(hDc, 50, 75);
    LineTo(hDc, 60, 25);
 
    TextOut(hDc, 41, 10, PathMiter, 12);
    SelectObject(hDc, oldPen);
 
    return TRUE;
}
 
int BeveledPath(HDC hDc)
{
    lb.lbStyle = BS_SOLID;
    lb.lbColor = BLACK_BRUSH;
    lb.lbHatch = 0;
 
    ExtCreatePen(PS_SOLID || PS_GEOMETRIC || PS_ENDCAP_FLAT || PS_JOIN_MITER, 10, &lb, 0, 0);
    SelectObject(hDc, hPen);
 
    BeginPath(hDc);
    MoveToEx(hDc, 70, 25, 0);
    LineTo(hDc, 80, 75);
    LineTo(hDc, 90, 25);
    EndPath(hDc);
 
    StrokePath(hDc);
    DeleteObject(hPen);
 
    GetStockObject(BLACK_PEN);
    SelectObject(hDc, oldPen);
    MoveToEx(hDc, 70, 25, 0);
    LineTo(hDc, 80, 75);
    LineTo(hDc, 90, 25);
 
    TextOut(hDc, 71, 10, PathBevel, 12);
    SelectObject(hDc, oldPen);
 
    return TRUE;
}
 
int TopXY(DWORD wDim, DWORD sDim)
{
    sDim = sDim << 1;
    wDim = wDim << 1;
    return sDim -= wDim;
}
1
Wanna be serious
586 / 473 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
25.10.2017, 17:23  [ТС] 5
nmcf, исправил:
Кликните здесь для просмотра всего текста
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
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    MSG msg;
    int Wwd;
    int Wht;
    int Wtx;
    int Wty;
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW || CS_VREDRAW || CS_BYTEALIGNWINDOW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
    wc.lpszMenuName = 0;
    wc.lpszClassName = szClassName;
    wc.hIcon = LoadIcon(hInstance, (LPCSTR)IDI_ICON1);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hIconSm = 0;
 
    if (!RegisterClassEx(&wc))
    {
        MessageBox(hWnd, "Ошибка!", "Ошибка", 0);
    }
 
    Wwd = 500;
    Wht = 350;
    GetSystemMetrics(SM_CXSCREEN);
    TopXY(Wwd, Wht);
    Wtx = 0;
    GetSystemMetrics(SM_CYSCREEN);
    TopXY(Wht, Wht);
    Wty = 0;
 
    //Создание  диалогового окна
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szClassName, szDisplayName, WS_OVERLAPPEDWINDOW, Wtx, Wty, Wwd, Wht, 0, 0, hInstance, 0);
    ghInstance = hInstance;
    //hWnd = CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, WndProc, (LONG)0);
 
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);
 
    HWND hWndDialog = hWnd;
 
    //// Стандартный цикл обработки сообщений приложения
    while (GetMessage(&msg, NULL, 0, 0))
        if (!IsDialogMessage(hWndDialog, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    DestroyWindow(hWndDialog);
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hWin, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    switch (wMsg)
    {
        // Сообщение о инициализации диалогового окна
    case WM_INITDIALOG:
 
        break;
 
    case WM_PAINT:
        BeginPaint(hWnd, ps);
        SetMapMode(hDc, MM_ANISOTROPIC);
        SetWindowExtEx(hDc, 100, 100, 0);
        GetClientRect(hWnd, rct);
        SetViewportExtEx(hDc, rct->right, rct->bottom, 0);
 
        RoundedPath(hDc);
        MiteredPath(hDc);
        BeveledPath(hDc);
 
        EndPaint(hWnd, ps);
 
        // Сообщение о закрытии диалогового окна
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
 
    default:
        return FALSE;
    }
    DefWindowProc(hWnd, wMsg, wParam, lParam);
 
    return TRUE;
}


Но все равно окно не появляется. Регистрация класса происходит, но как я понимаю, программа уходит в бесконечный цикл в моменте обработки событий

Добавлено через 2 минуты
nikolay1982, спасибо большое! Запускается. Осталось теперь привести к тому виду, к которому требуется по заданию
0
25.10.2017, 17:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2017, 17:23
Помогаю со студенческими работами здесь

Перевод кода С++ на Assembler
Дали задачку, которую нужно реализовать на ассемблере, можно ли написать код на с++ а потом...

Компилирование кода Assembler
cseg segment ;чтобы работало в реальном режиме assume cs:cseg, ds:cseg org 100h main...

Перевод кода из Pascal в Assembler
Люди добрые, помогите, нужно перевести часть программного кода из Pascal в Assembler. 1) Как...

Преобразование кода из Pascal в Assembler
Помогите, пожалуйста, преобразовать код из Pascal в Assembler. Сам код: var min, ans: array of...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru