Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ WinAPI Сабклассинг контрола RichEdit привет всем! программирую на С++, использую чистый WinAPI. Проблема в следующем: делаю Subclassing RichEdit'а, в нём подлавливаю сообщение VK_BACK(возникает, когда нажимаем backspace), в нём произвожу следующие действия: считываю содержимое текста находящегося в данный момент в RichEdit, и если в нём два символа то выхожу из обработчика без передачи управления настоящей функции окна... https://www.cyberforum.ru/ win-api/ thread1698.html C++ WinAPI Переход между контролами по Tab
Как организовать переход между контролами по Tab в приложении на WinApi?
C++ WinAPI Получение текста из списка https://www.cyberforum.ru/ win-api/ thread1485.html
Помогите решить следующию проблему. Хочу получить текст из списка. Окно списка я получил (закрыть, зделать невидимым и т.п. могу), дочерных окон у списка нет, но команда WM_GETTEXT, которая передается окну, ничего не возвращает... Что делать??:confused:
C++ WinAPI Нужна помощь Win32API https://www.cyberforum.ru/ win-api/ thread965.html
Помогите,плиз. Нужно сделать так, чтобы символ вводимый с клавиатуры , отображался в созданном окне. Окно создал а вот с событием WM_CHAR проблемы, не могу код символа (тип UINT) привести к char * , чтобы использовать TextOut . case WM_CHAR: { hDC=BeginPaint(hWnd,&ps); SetTextAlign( hDC, TA_CENTER); TextOut(hDC,150,150,wParam,5); EndPaint(hWnd,&ps); };Где-то...
Смаргивает черный фон в прозрачном окне C++ WinAPI
Доброго времени суток! Использую стиль WS_EX_LAYERED и ф-цию SetLayeredWindowAttributes для создания прозрачного окна. Все работает, вот только есть один неприятный эффект: когда окно появляется на экран, сначала отрисовывается черный фон, а потом само окно. Кто нибудь может помочь? Вот код: #include <windows.h> LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); int WINAPI...
C++ WinAPI Автозагрузка Как мне добавить свою прогу в автозагрузку? Я знаю один код, только не знаю куда его писать, подскажите... HKEY hKey; char szPath; GetModuleFileName(NULL, szPath, sizeof(szPath)); RegCreateKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", NULL, "", ... https://www.cyberforum.ru/ win-api/ thread460.html
1 / 1 / 0
Регистрация: 04.04.2007
Сообщений: 23
0

GDI, программа "Змея" - C++ WinAPI - Ответ 7188

13.05.2007, 15:36. Показов 4298. Ответов 1
Метки (Все метки)

Author24 — интернет-сервис помощи студентам
добрый день!!!
тут мне курсовик задали
"Написать программу-игру «Змея». Змея двигается по полю, собирая объекты, увеличивающие количество очков. Со временем тело змеи удлиняется. Змея не должна пересикать свое тело и объекты типа «стена». "

дело в том что я с графическим интерфейсом не работаю.

возникла вот такая ситуация, при передвижении змеи.
Не отображается передвижение по окну, а при сворачивании и разворачивании окна, она перерисовывается заданным координатам.

вот мой код:

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
// snake.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
#include "snake.h"
#include "tail.h"
 
#define MAX_LOADSTRING 100
#define UPDWIN 300
 
// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
 
// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
void timeproc(HWND, UINT, UINT_PTR, DWORD);
 
HBRUSH br, upBr;
block bl(0,0,10,10);
tail snake;
RECT rect;
HWND hWnd;
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    snake.insertBlock(bl);
    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;
 
    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_SNAKE, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
 
    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SNAKE));
    
    SetTimer(hWnd, 1, 300, (TIMERPROC)timeproc);
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int) msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SNAKE));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_SNAKE);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   
   hInst = hInstance; // Store instance handle in our global variable
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
    
   
   return TRUE;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent=0;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_KEYDOWN:
        wmId    = LOWORD(wParam);
        switch(wmId)
        {
            case VK_UP:
                rect.top|=1;
                rect.bottom=rect.left=rect.right=0;
                break;
            case VK_DOWN:
                rect.bottom|=1;
                rect.left=rect.right=rect.top=0;
                break;
            case VK_LEFT:
                rect.left|=1;
                rect.bottom=rect.right=rect.top=0;
                break;
            case VK_RIGHT:
                rect.right|=1;
                rect.bottom=rect.left=rect.top=0;
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case UPDWIN:
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        SelectObject(hdc, br);
             MoveToEx(hdc, snake.getBlock().Top(), snake.getBlock().Left(),NULL);
        MoveToEx(hdc, snake.getBlock().Bottom(), snake.getBlock().Right(), NULL);
        Rectangle(hdc, snake.getBlock().Left(), snake.getBlock().Top(),
            snake.getBlock().Right(), snake.getBlock().Bottom());
        EndPaint(hWnd, &ps);
        break;
    case WM_CREATE:
       br=CreateSolidBrush(RGB(12, 43, 143));
        break;
    case WM_DESTROY:
        DeleteObject(br);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
void timeproc(HWND hWnd, UINT uiNt, UINT_PTR puiNt, DWORD dw)
{
    if(rect.top==1)
    {
        snake.getBlock().Top(snake.getBlock().Top()-10);
        snake.getBlock().Bottom(snake.getBlock().Bottom()-10);
    }
    if(rect.bottom==1)
    {
            snake.getBlock().Bottom(snake.getBlock().Bottom()+10);
            snake.getBlock().Top(snake.getBlock().Top()+10);
    }
    if(rect.left==1)
    {
        snake.getBlock().Left(snake.getBlock().Left()-10);
        snake.getBlock().Right(snake.getBlock().Right()-10);
    }     
    if(rect.right==1)           
    {
        snake.getBlock().Right(snake.getBlock().Right()+10);
        snake.getBlock().Left(snake.getBlock().Left()+10);
    }
    SendMessage(hWnd, WM_PAINT, NULL, NULL);
}
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
/////////////////////////////////////////////////////////////////////////////////////////////////
//////
/////  block.h
/////////////////////////////////////////////////////////////////////////////////////////////////
 
#ifndef Block_sn
#define Block_sn
 
#include "stdafx.h"
class block
{
public:
//  block() {}
    block(int l=0, int t=0, int r=0, int b=0);
    block(const block & obj);
    inline int Left()const;
    inline void Left(int cord);
    inline int Top()const;
    inline void Top(int cord);
    inline int Right()const;
    inline void Right(int cord);
    inline int Bottom()const;
    inline void Bottom(int cord);
    int blockId()const;
    void blockId(int id);
    block & operator =(const block & obj);
private:
    int id;
    int left;
    int top;
    int right;
    int bottom;
};
#endif
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
/////////////////////////////////////////////////////////////////////////////////////////////////
///////
//////   block.cpp
///////////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "block.h"
 
block::block(int l, int t, int r, int b)
{
    left=l;top=t;right=r;bottom=b;
}
block::block(const block &obj)
{
    if(this==&obj)
        return;
    *this=obj;
}
block & block::operator =(const block &obj)
{
    if(this!=&obj)
    {
        Left(obj.Left());
        Top(obj.Top());
        Right(obj.Right());
        Bottom(obj.Bottom());
    }
    return *this;
}
inline int block::Left()const{return left;}
inline void block::Left(int cord){left=cord;}
inline int block::Top()const{return top;}
inline void block::Top(int cord) {top=cord;}
inline int block::Right()const{return right;}
inline void block::Right(int cord) {right=cord;}
inline int block::Bottom()const{return bottom;}
inline void block::Bottom(int cord){bottom=cord;}
int block::blockId()const{return id;}
void block::blockId(int i){id=i;}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
////////////////////////////////////////////////////////////////////////////////////////////////////
/////////
/////////  tail.h
/////////////////////////////////////////////////////////////////////////////////////////////////////
 
#include "stdafx.h"
#include "block.h"
#include <list>
 
static int nextId_;
class tail
{
public:
    tail(){}
    bool insertBlock(const block & obj, int recordId=0);
    const block & getBlock()const;
    block & getBlock();
private:
    tail(const tail & ){}
    typedef std::list<block> listblock;
    listblock blocks_; 
};
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
//////////////////////////////////////////////////////////////////////////////////////////////////////
////////
//////// tail.cpp
//////////////////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "block.h"
#include "tail.h"
 
bool tail::insertBlock(const block &obj, int recordId)
{
    if(recordId==0)
        recordId=nextId_++;
    else
        nextId_=recordId+1;
 
    for(listblock::iterator i=blocks_.begin();
        i!=blocks_.end(); ++i)
        if(recordId==i->blockId())
            return false;
    blocks_.push_back(obj);
    blocks_.back().blockId(recordId);
    return true;
}
const block & tail::getBlock()const
{
    listblock::const_iterator i=blocks_.begin();
    return *i;
}
block & tail::getBlock()
{
    listblock::iterator i=blocks_.begin();
    return *i;
}


Вернуться к обсуждению:
GDI, программа "Змея" C++ WinAPI
0
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2007, 15:36
Готовые ответы и решения:

Выбор между GDI / GDI+ / CreateWindow
Приветствую. У меня накопилось несколько вопросов и я был бы очень рад получить на них ответ. Я...

Есть ли в WPF полноценная замена GDI+? Чтобы можно было всё, что можно в GDI+? Просто думаю углубляться в работу с изображениями в WPF или GDI.
Ну собственно весь вопрос в заголовке темы.

Программа с использованием GDI+
Нужно создать программу с использованием GDI+ (построить изображение объекта с заливкой). Объект:...

По умолчанию при создании приложения Windows Forms стоит gdi или gdi+
И если обычный gdi - как между ними переключиться?

Автономная библиотека GDI и GDI+
Понадобилось как то подключить к проекту функции GDI+ стал гуглить описание одной из этих функций...

1
13.05.2007, 15:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2007, 15:36
Помогаю со студенческими работами здесь

Одновременное использование GDI / GDI+
Добрый день. Был всегда убежденным Дельфистом, но решил попробовать силы в написании проги на С++,...

змея.
всем привет! написал рекорды к игре, но они выводятся на экран и почему то не видно чисел, они...

Определить, пересечет ли себя змея
Здравствуйте, оговорюсь сразу, я не хочу что бы кто то решал за меня или скидывал исходники. Нужно...

Змея кусает свой хвост
В двумерной матрице NxN живет змея длинной K=2i. Требуется находить положения змеи в матрице, при...

Определить, образует ли змея замкнутый контур
На игровом поле размером NxM , размещено змею - непрерывную ломаную, шириной 1 ячейку, которая...

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