21

(12 відповідей, залишених у C#, .NET)

varkon написав:

Можливо тому, що вам треба опрацювати виключення у вашому ДАЛ та сгенерувати наступне користуючись throw?


Навряд. Я писав, що "ДАЛ, при спробі додати такого користувача, видає Exception, блок catch записує даний Exception в Response і той повертається WCF Сервісу" (це я прослідкував). Тобто метод adder.AddNewManager(newManager); повертає згенероване ДАЛом виключення
Ось метод на стороні ДАЛа:

public Response AddManager(AdvertisingManager newManager)
        {
            Response result = new Response();
            try
            {
                fivePlus.Users.Add(newManager);
                fivePlus.SaveChanges();
                result.Result = true;
                result.Message = $"Менеджер {newManager.AdvertisingManagerName} успішно доданий в базу даних";
            }
            catch (Exception ex)
            {
                result.Ex = ex;
                result.Message = $"При додаванні менеджера {newManager.AdvertisingManagerName} в базу даних сталася помилка!";
            }
            return result;
        }

22

(25 відповідей, залишених у C#, .NET)

Я просльозився

23

(12 відповідей, залишених у C#, .NET)

Я розумію, що потрібно ретельніше перевіряти дані і т.п., але така ж фігня відбувається і тоді, коли БД з певних причин недоступна: ДАЛ генерує Exception, який повертається WCF Сервісу, але останній тупо крашиться і розриває з*єднання.

Метод, який звертається до Сервіса

public ResponseToUser AddNewManager(AdvertisingManagerPoco Manager)
        {
            ResponseToUser toReturn = new ResponseToUser();
            try
            {
                ResponsePOCO response = client.AddManager(new AdvertisingManager()
                {
                    AdvertisingManagerName = Manager.AdvertisingManagerName,
                    AdvertisingManagerSurname = Manager.AdvertisingManagerSurname,
                    AdvertisingManagerPhoneNumber = Manager.AdvertisingManagerPhoneNumber,
                    UserEmail = Manager.UserEmail,
                    IsDisabled = false,
                    UserLogin = Manager.UserLogin,
                    UserPassword = Manager.UserPassword
                });
                toReturn.Ex = response.Ex;
                toReturn.Message = response.Message;
                toReturn.Result = response.Result;
            }
            catch (Exception ex)
            {
                toReturn.Ex = ex;
                toReturn.Message = ex.Message;
                toReturn.Result = false;
            }

            return toReturn;
        }

Метод на стороні Сервіса

        public ResponsePOCO AddManager(AdvertisingManager newManager)
        {
            return adder.AddNewManager(newManager);
        }

24

(12 відповідей, залишених у C#, .NET)

Пишу програму для автоматизації роботи та зберігання даних певної організації
Виникли певні складнощі з розумінням роботи WCF Сервіса
Код писати тут не буду, бо нереально багато і суть питання в логіці, а не коді
Програма багаторівнева:
1) WPF Інтефейс користувача (усілякі форми, дата гріди і т.п. + первинна перевірка даних в оборобниках)
2) Бібліотека бізнес логіки(створюється WCF клієнт та викликаються його методи)
3) WCF Сервіс (звичайний посередник)
4) Бібліотека бізнес логіки (Ретельна перевірка даних)
5) ДАЛ (запис, читання, перевірка по БД)

Коротше, суть проблеми:
Потрібно додати нового менеджера в базу даних. Дії наступні:
1. Заповнюємо необхідні поля WPF форми (!!! усі вони є обов*язковими для БД)
2. Робимо первинну перевірку введених даних і викликаємо метод додавання менеджера на стороні WCF Сервіса
3. WCF Сервіс викликає відповідний метод з Бізнес логіки
4. БЛЛ (бізнес логіка) робить різні перевірки (існування лоігна, мейла в БД ...), конвертації даних і звертається до ДАЛа (якщо все в порядку, звісно), щоб той додав нового менеджера в БД
5. ДАЛ робить свою непильну роботу і тут нам має бути щастя

На кожному етапі, починаючи з третього(включно), усі методи повертають нам екземпляр створеного мною класу Response {Exception ex, bool Result, string Message}.

Нарешті ми підійшли до суті проблеми.
Якщо я заповнюю усі поля правильно (валідними даними), то менеджер успішно додається в БД і мені повертається наступний Response {ex == null, Result == true, Message == "Користувач такий-то успішно доданий в базу даних"}.
Якщо якась із перевірок відловлює помилку, то мені повертається Response з усіма відповідними даними, наприклад {ex == null, Result == false, Message == "Користувач з таким логіном уже існує"}

Але, якщо я додаю менеджера у якого замість імені введено декілька пробілів (решта даних валідна), то ДАЛ, при спробі додати такого користувача, видає Exception, блок catch записує даний Exception в Response і той повертається WCF Сервісу. Але тут стається магія і WCF Сервіс, замість того, щоб показати нам Exception ДАЛа, генерує власний Exception, скрін якого я прикріпив до даної теми.

питання досить очевидне: чому WCF Сервіс викидає власний Exception, а не повертає той, що йому передали?

25

(5 відповідей, залишених у C#, .NET)

Коротше. Проблема явно в System.Net.Mail
Я встановив ось цю фігню https://sourceforge.net/p/netimplicitss … e-the-code (АІМ) в NuGet packages, написав за їхнім прикладом код і все запрацювало з першого разу

АІМ безкоштовний, в разі чого

26

(5 відповідей, залишених у C#, .NET)

Народ, хтось вирішив цю проблему?
Бо бачу, що роки йдуть, а нічого в Net.Mail не змінилося (((

27

(9 відповідей, залишених у C#, .NET)

Багато часу вже сплило. Довго я колупався з цими бібліотеками і ми (усі колупальники) дійшли наступного висновку, що слеші жодної ролі не відіграють. Бібліотеки, які ми писали самі вичитувались на ура і описані в них методі теж запускались без проблем. Сторонні ж бібліотеки вичитувались уже зовсім по-різному, особливо якщо мова йшла про майкрософтовські бібліотеки: деякі вичитувались лише частково, до інших доступ взагалі був відсутній.
В результаті ми підзабили і змирились.

28

(5 відповідей, залишених у C#, .NET)

Може розглянути використання класів Mutex або Semaphore?
В першому випадку тільки один потік зможе доступитися до методу, а у випадку з семафором, він поставить їх у чергу і надаватиме доступ по черзі.
Тобто, якщо змінна r у вас оголошується в самому методі, то використання м*ютексу або семафору унеможливить зміну її значення

29

(9 відповідей, залишених у C#, .NET)

Щось нічого не виходить навіть після заміни слешів в строці. Прикріпив одну з бібліотек, яку намагаюся прочитати

30

(9 відповідей, залишених у C#, .NET)

koala написав:
boshik1983 написав:
koala написав:

А файл, який ви відкриваєте, є збіркою .Net Framework?

Так. С#-ні проекти

І зібрані тією ж версією VS?
Бо виглядає, що воно чутливе.


Саме так, версія та сама. Завтра спробую слеші замінити, бо проект на роботі, і відпишусь.

31

(9 відповідей, залишених у C#, .NET)

LoganRoss написав:

Поміняйте "\\" на "/", щоб було

C:/the/path/to/the/file

Тобто пройтися по строці і замінити усі бекслеші на звичайні?

32

(9 відповідей, залишених у C#, .NET)

koala написав:

А файл, який ви відкриваєте, є збіркою .Net Framework?

Так. С#-ні проекти

33

(9 відповідей, залишених у C#, .NET)

Привіт, форумчани. Є наступне завдання (wpf додаток):
1. Обираємо папку
2. Вичитуємо з папки і підпапок .длл файли і додаємо їх в Ліст-бокс
3. тицькаємо мишкою на вподобаний файл і в наступному Ліст-боксі мають з*явитися усі класи цієї бібліотеки
4. тицькаємо на клас і з*являються усі методи класу.

У мене проблема в пункті 3. Щоб вичитати класи, я створюю AppDomain та Assembly. Але при завантаженні файлу в Assembly, викидає FileLoadException помилку. На мсдн прочитав, що передаватись має повний шлях, що, здається, і роблю. Чи може таке бути, що у мене немає прав доступу?

Ось бекграунд код:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;

using WinForms = System.Windows.Forms;

namespace HomeWork_DLL_Reflection
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void bt_ChooseFolder_Click(object sender, RoutedEventArgs e) // відкриваємо вікно вибору папки та передаємо шлях в текст-бокс
        {
            WinForms.FolderBrowserDialog folderDialog = new WinForms.FolderBrowserDialog();
            folderDialog.ShowNewFolderButton = false;
            folderDialog.SelectedPath = System.AppDomain.CurrentDomain.BaseDirectory;
            WinForms.DialogResult result = folderDialog.ShowDialog();
            if (result == WinForms.DialogResult.OK)
            {
                tb_URL.Text = folderDialog.SelectedPath;
            }
        }

        private List<String> DirSearch(string sDir) // пошук файлів в папці та підпапках і додавання їх в Ліст
        {
            List<String> files = new List<String>();
            try
            {
                foreach (string f in Directory.GetFiles(sDir, "*.dll"))
                {
                    files.Add(f);
                }
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    files.AddRange(DirSearch(d));
                }
            }
            catch (System.Exception excpt)
            {
                MessageBox.Show(excpt.Message);
            }

            return files;
        }

        private void bt_OK_Click(object sender, RoutedEventArgs e) // додаємо усі знайдені бібліотеки в Ліст-бокс форми
        {
            List<String> dlls = new List<string>();
            if (tb_URL.Text != "")
            {
                dlls = DirSearch(tb_URL.Text);
            }
            foreach (var item in dlls)
            {
                listBox_Dlls.Items.Add(item);
            }
        }

        private void listBox_Dlls_SelectionChanged(object sender, SelectionChangedEventArgs e) // коли обираємо бібліотеку, вичитуємо її класи і передаємо в Ліст-бокс
        {
            //Assembly addDLL = Assembly.LoadFile(listBox_Dlls.SelectedItem.ToString());


            AppDomain domain = AppDomain.CreateDomain("ClassesAndMethodsDomain");
            Assembly asm = domain.Load(AssemblyName.GetAssemblyName(listBox_Dlls.SelectedItem.ToString())); // викидає помилку про неможливість завантаження файлу
            var classes = asm.GetTypes(); // you can use GetTypes to get all classes in that assembly
            foreach (var c in classes)
            {
                listBox_ClassesMethods.Items.Add($"Class {c.Name} methods :");
                // you can get all methods which is defined in this class with GetMethods
                var methods = c.GetMethods();
                foreach (var item in methods)
                {
                    listBox_ClassesMethods.Items.Add(item.Name);
                }
                // or you can get all properties defined in this class
                var props = c.GetProperties();
                listBox_ClassesMethods.Items.Add($"Class {c.Name} properties :");
                foreach (var item in props)
                {
                    listBox_ClassesMethods.Items.Add(item.Name);
                }
                listBox_ClassesMethods.Items.Add("");
            }

        }
    }
}

34

(4 відповідей, залишених у C++)

Поставив 2 брейка після  case IDTIMER_Reverse: та case IDTIMER_Clockwise:

#include <iostream>
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int xWindowSize = GetSystemMetrics(SM_CXSCREEN);        // ширина екрану у пікселях
int yWindowSize = GetSystemMetrics(SM_CYSCREEN);        // висота екрану у пікселях
RECT rcWindow;

int cxWindowClient;        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
int cyWindowClient;        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
int cyWindowTitle;            // висота заголовка
int cyWindowBorder;            // ширина рамки вікна
int cxWindowBorder;            // ширина рамки вікна

enum Direction
{
    left, right, up, down
};

int move = 0;
static int dir = Direction::down;

void changeDirectionToOposite(int &dir)
{
    if (dir == Direction::down)
    {
        dir = Direction::up;
    }
    if (dir == Direction::up)
    {
        dir = Direction::down;
    }
    if (dir == Direction::left)
    {
        dir = Direction::right;
    }
    if (dir == Direction::right)
    {
        dir = Direction::left;
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static wchar_t szAppName[] = L"DemoFig";

    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szAppName;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wc);

    HWND hwnd;
    hwnd = CreateWindow(szAppName, L"Демонстрація таймерів", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, iCmdShow);
    //UpdateWindow(hwnd); 

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;

}//    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 


LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    const UINT IDTIMER = 23454;
    const UINT IDTIMERSHOW = 21123454;
    const UINT IDTIMER_Reverse = 222;
    const UINT IDTIMER_Clockwise = 111;

    HDC hdc;
    PAINTSTRUCT ps;
    switch (iMsg)
    {

    case WM_CREATE:
        SetTimer(hwnd, IDTIMER, 100, NULL);
        break;

    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        EndPaint(hwnd, &ps);
        return 0;


    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;


    case WM_TIMER:
    {
        switch (wParam)
        {
        case IDTIMER:
            wchar_t buf[444];
            SYSTEMTIME st;
            //GetSystemTime( &st );
            GetLocalTime(&st);
            wsprintf(buf, L" Сьогодні %02i.%02i.%i.    Зараз %02i:%02i:%02i ", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
            SetWindowText(hwnd, buf);
            break;

        case IDTIMER_Reverse: //проти часової стрілки
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            if (dir == Direction::down) //вниз && rcWindow.bottom != yWindowSize
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top + 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.bottom >= yWindowSize)
                {
                    rcWindow.top = yWindowSize - (rcWindow.bottom - rcWindow.top);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::right;
                }
            }
            else if (dir == Direction::right) //вправо && rcWindow.right != xWindowSize
            {
                MoveWindow(hwnd, rcWindow.left + 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.right >= xWindowSize)
                {
                    rcWindow.left = xWindowSize - (rcWindow.right - rcWindow.left);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::up;
                }
            }
            else if (dir == Direction::up) //вверх && rcWindow.top != 0
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top - 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.top <= 0)
                {
                    MoveWindow(hwnd, rcWindow.left, 0, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::left;
                }
            }
            else if (dir == Direction::left) //вліво && rcWindow.left != 0
            {
                MoveWindow(hwnd, rcWindow.left - 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.left <= 0)
                {
                    MoveWindow(hwnd, 0, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::down;
                }
            }
            break;
        }

        case IDTIMER_Clockwise: // за годинниковою стрілкою
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            if (dir == Direction::down) //вниз && rcWindow.bottom != yWindowSize
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top + 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.bottom >= yWindowSize)
                {
                    rcWindow.top = yWindowSize - (rcWindow.bottom - rcWindow.top);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::left;
                }
            }
            else if (dir == Direction::right) //вправо && rcWindow.right != xWindowSize
            {
                MoveWindow(hwnd, rcWindow.left + 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.right >= xWindowSize)
                {
                    rcWindow.left = xWindowSize - (rcWindow.right - rcWindow.left);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::down;
                }
            }
            else if (dir == Direction::up) //вверх && rcWindow.top != 0
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top - 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.top <= 0)
                {
                    MoveWindow(hwnd, rcWindow.left, 0, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::right;
                }
            }
            else if (dir == Direction::left) //вліво && rcWindow.left != 0
            {
                MoveWindow(hwnd, rcWindow.left - 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.left <= 0)
                {
                    MoveWindow(hwnd, 0, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::up;
                }
            }
            break;
        }

        case IDTIMERSHOW:    // показуємо приховане вікно
            SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
            KillTimer(hwnd, IDTIMERSHOW);
            break;
        }
    }

    break;

#pragma region MOVE
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
        case L'Q':        // ставить вікно у лівий верхній кут
            SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE);
            break;

        case L'Z':        // ставить вікно у правий нижній кут
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            int dx = cxWindowClient + cxWindowBorder - rcWindow.right;                        // на скільки змістити праворуч
            int dy = cyWindowClient + cyWindowBorder + cyWindowTitle - rcWindow.bottom;        // на скільки зсунути донизу

            OffsetRect(&rcWindow, dx, dy);

            //SetWindowPos( hwnd, NULL, rcWindow.left, rcWindow.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
            MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
        }
        break;

        case L'H':        // Згортає вікно 
            SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_HIDEWINDOW);
            SetTimer(hwnd, IDTIMERSHOW, 3000, NULL);
            break;

        case L'R':        // Розгортає вікно 
        {
            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна
            SetWindowPos(hwnd, NULL, 0, 0, cxWindowClient + cxWindowBorder * 2, cyWindowClient + cyWindowBorder + cyWindowTitle, SWP_SHOWWINDOW);
        }

        case VK_LEFT:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            if (rcWindow.left != 0)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left - 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left - 20, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left - 1, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

        case VK_RIGHT:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна


            if (rcWindow.right != xWindowSize)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left + 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left + 20, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left + 1, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

        case VK_UP:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            //int dx = cxWindowClient + cxWindowBorder - rcWindow.right;                        // на скільки змістити праворуч
            //int dy = 0;        // на скільки зсунути донизу

            //OffsetRect(&rcWindow, dx, dy);

            //SetWindowPos( hwnd, NULL, rcWindow.left, rcWindow.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
            if (rcWindow.top != 0)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top - 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top - 20, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top - 1, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

        case VK_DOWN:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            //int dx = cxWindowClient + cxWindowBorder - rcWindow.right;                        // на скільки змістити праворуч
            //int dy = 0;        // на скільки зсунути донизу

            //OffsetRect(&rcWindow, dx, dy);

            //SetWindowPos( hwnd, NULL, rcWindow.left, rcWindow.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
            if (rcWindow.bottom != yWindowSize)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top + 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top + 20, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top + 1, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

#pragma endregion

        case VK_RETURN: // при натисканні Ентер
        {
            KillTimer(hwnd, IDTIMER_Clockwise); // вбиваємо таймер за годинниковою
            changeDirectionToOposite(dir); // змінюємо напрямок на протилежний
            SetTimer(hwnd, IDTIMER_Reverse, 100, NULL); // запускаємо таймер проти годинникової стрілки по клавіші ENTER
            break;
        }

        case VK_SPACE:  // при натисканні пробілу Space bar
        {
            KillTimer(hwnd, IDTIMER_Reverse);
            changeDirectionToOposite(dir);
            SetTimer(hwnd, IDTIMER_Clockwise, 100, NULL);// запускаємо таймер за годинниковою стрілкою
            break;
        }

        case VK_ESCAPE: // при натисканні Escape
        {
            KillTimer(hwnd, IDTIMER_Reverse);
            KillTimer(hwnd, IDTIMER_Clockwise);
            dir = Direction::down;
            break;
        }
        break;

        }

    }
    break;

    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
} // LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 

35

(4 відповідей, залишених у C++)

Точно. Саме очевидне випустив.
Виникло, по ходу справи, ще одне питання:
якщо запущено цикл по годинниковій і при цьому натиснути Ентер (вмикає реверс), то вікно не відразу змінює напрямок, а спочатку доходить до краю екрана, а вже тоді починає рух в протилежному напрямку. З чим це пов*язано?

36

(4 відповідей, залишених у C++)

Добрий день. Одним із завдань є змусити вікно рухатися по периметру екрана проти годинникової стрілки після натискання Ентер, за годинниковою при натисканні пробілу і зупитини при Ескейп.
Все це діло реалізовано через таймери: коли потрібно створюється або убивається відповідний таймер,
Ескейп працює безвідмовно. З пробілом ніби все теж нормально, а от при натисканні Ентеру відбувається якесь дикунство: 1. екран може просто зупинитися в кутку, почати розширюватися, втікати за межі екрану, почати рухатися в два рази швидше, продовжити рух ЗА годинниковою стрілкою.
Ось код:

#include <iostream>
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int xWindowSize = GetSystemMetrics(SM_CXSCREEN);        // ширина екрану у пікселях
int yWindowSize = GetSystemMetrics(SM_CYSCREEN);        // висота екрану у пікселях
RECT rcWindow;

int cxWindowClient;        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
int cyWindowClient;        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
int cyWindowTitle;            // висота заголовка
int cyWindowBorder;            // ширина рамки вікна
int cxWindowBorder;            // ширина рамки вікна

enum Direction
{
    left, right, up, down
};

int move = 0;
static int dir = Direction::down;

void changeDirectionToOposite(int &dir)
{
    if (dir == Direction::down)
    {
        dir = Direction::up;
    }
    if (dir == Direction::up)
    {
        dir = Direction::down;
    }
    if (dir == Direction::left)
    {
        dir = Direction::right;
    }
    if (dir == Direction::right)
    {
        dir = Direction::left;
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static wchar_t szAppName[] = L"DemoFig";

    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szAppName;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wc);

    HWND hwnd;
    hwnd = CreateWindow(szAppName, L"Демонстрація таймерів", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, iCmdShow);
    //UpdateWindow(hwnd); 

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;

}//    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 


LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    const UINT IDTIMER = 23454;
    const UINT IDTIMERSHOW = 21123454;
    const UINT IDTIMER_Reverse = 222;
    const UINT IDTIMER_Clockwise = 111;

    HDC hdc;
    PAINTSTRUCT ps;
    switch (iMsg)
    {

    case WM_CREATE:
        SetTimer(hwnd, IDTIMER, 100, NULL);
        break;

    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        EndPaint(hwnd, &ps);
        return 0;


    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;


    case WM_TIMER:
    {
        switch (wParam)
        {
        case IDTIMER:
            wchar_t buf[444];
            SYSTEMTIME st;
            //GetSystemTime( &st );
            GetLocalTime(&st);
            wsprintf(buf, L" Сьогодні %02i.%02i.%i.    Зараз %02i:%02i:%02i ", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
            SetWindowText(hwnd, buf);
            break;

        case IDTIMER_Reverse: //проти часової стрілки
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            if (dir == Direction::down) //вниз && rcWindow.bottom != yWindowSize
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top + 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.bottom >= yWindowSize)
                {
                    rcWindow.top = yWindowSize - (rcWindow.bottom - rcWindow.top);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::right;
                }
            }
            else if (dir == Direction::right) //вправо && rcWindow.right != xWindowSize
            {
                MoveWindow(hwnd, rcWindow.left + 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.right >= xWindowSize)
                {
                    rcWindow.left = xWindowSize - (rcWindow.right - rcWindow.left);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::up;
                }
            }
            else if (dir == Direction::up) //вверх && rcWindow.top != 0
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top - 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.top <= 0)
                {
                    MoveWindow(hwnd, rcWindow.left, 0, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::left;
                }
            }
            else if (dir == Direction::left) //вліво && rcWindow.left != 0
            {
                MoveWindow(hwnd, rcWindow.left - 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.left <= 0)
                {
                    MoveWindow(hwnd, 0, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::down;
                }
            }
        }

        case IDTIMER_Clockwise: // за годинниковою стрілкою
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            if (dir == Direction::down) //вниз && rcWindow.bottom != yWindowSize
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top + 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.bottom >= yWindowSize)
                {
                    rcWindow.top = yWindowSize - (rcWindow.bottom - rcWindow.top);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::left;
                }
            }
            else if (dir == Direction::right) //вправо && rcWindow.right != xWindowSize
            {
                MoveWindow(hwnd, rcWindow.left + 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.right >= xWindowSize)
                {
                    rcWindow.left = xWindowSize - (rcWindow.right - rcWindow.left);
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::down;
                }
            }
            else if (dir == Direction::up) //вверх && rcWindow.top != 0
            {
                MoveWindow(hwnd, rcWindow.left, rcWindow.top - 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.top <= 0)
                {
                    MoveWindow(hwnd, rcWindow.left, 0, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::right;
                }
            }
            else if (dir == Direction::left) //вліво && rcWindow.left != 0
            {
                MoveWindow(hwnd, rcWindow.left - 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                if (rcWindow.left <= 0)
                {
                    MoveWindow(hwnd, 0, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                    dir = Direction::up;
                }
            }

        }

        case IDTIMERSHOW:    // показуємо приховане вікно
            SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
            KillTimer(hwnd, IDTIMERSHOW);
            break;
        }
    }

    break;

#pragma region MOVE
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
        case L'Q':        // ставить вікно у лівий верхній кут
            SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE);
            break;

        case L'Z':        // ставить вікно у правий нижній кут
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            int dx = cxWindowClient + cxWindowBorder - rcWindow.right;                        // на скільки змістити праворуч
            int dy = cyWindowClient + cyWindowBorder + cyWindowTitle - rcWindow.bottom;        // на скільки зсунути донизу

            OffsetRect(&rcWindow, dx, dy);

            //SetWindowPos( hwnd, NULL, rcWindow.left, rcWindow.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
            MoveWindow(hwnd, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
        }
        break;

        case L'H':        // Згортає вікно 
            SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_HIDEWINDOW);
            SetTimer(hwnd, IDTIMERSHOW, 3000, NULL);
            break;

        case L'R':        // Розгортає вікно 
        {
            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна
            SetWindowPos(hwnd, NULL, 0, 0, cxWindowClient + cxWindowBorder * 2, cyWindowClient + cyWindowBorder + cyWindowTitle, SWP_SHOWWINDOW);
        }

        case VK_LEFT:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            if (rcWindow.left != 0)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left - 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left - 20, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left - 1, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

        case VK_RIGHT:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна


            if (rcWindow.right != xWindowSize)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left + 10, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left + 20, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left + 1, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

        case VK_UP:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            //int dx = cxWindowClient + cxWindowBorder - rcWindow.right;                        // на скільки змістити праворуч
            //int dy = 0;        // на скільки зсунути донизу

            //OffsetRect(&rcWindow, dx, dy);

            //SetWindowPos( hwnd, NULL, rcWindow.left, rcWindow.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
            if (rcWindow.top != 0)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top - 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top - 20, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top - 1, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

        case VK_DOWN:
        {
            GetWindowRect(hwnd, &rcWindow);    // отримує положення і розміри вікна

            cxWindowClient = GetSystemMetrics(SM_CXFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowClient = GetSystemMetrics(SM_CYFULLSCREEN);        // розмір клієнтської зони вікна у повноекранному режимі у пікселях
            cyWindowTitle = GetSystemMetrics(SM_CYCAPTION);            // висота заголовка
            cyWindowBorder = GetSystemMetrics(SM_CYBORDER);            // ширина рамки вікна
            cxWindowBorder = GetSystemMetrics(SM_CXBORDER);            // ширина рамки вікна

            //int dx = cxWindowClient + cxWindowBorder - rcWindow.right;                        // на скільки змістити праворуч
            //int dy = 0;        // на скільки зсунути донизу

            //OffsetRect(&rcWindow, dx, dy);

            //SetWindowPos( hwnd, NULL, rcWindow.left, rcWindow.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
            if (rcWindow.bottom != yWindowSize)
            {
                if (GetAsyncKeyState(VK_SHIFT))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top + 10, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else if (GetAsyncKeyState(VK_CONTROL))
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top + 20, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
                else
                {
                    MoveWindow(hwnd, rcWindow.left, rcWindow.top + 1, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, TRUE);
                }
            }
            break;
        }

#pragma endregion

        case VK_RETURN: // при натисканні Ентер
        {
            KillTimer(hwnd, IDTIMER_Clockwise); // вбиваємо таймер за годинниковою
            changeDirectionToOposite(dir); // змінюємо напрямок на протилежний
            SetTimer(hwnd, IDTIMER_Reverse, 100, NULL); // запускаємо таймер проти годинникової стрілки по клавіші ENTER
            break;
        }

        case VK_SPACE:  // при натисканні пробілу Space bar
        {
            KillTimer(hwnd, IDTIMER_Reverse);
            changeDirectionToOposite(dir);
            SetTimer(hwnd, IDTIMER_Clockwise, 100, NULL);// запускаємо таймер за годинниковою стрілкою
            break;
        }

        case VK_ESCAPE: // при натисканні Escape
        {
            KillTimer(hwnd, IDTIMER_Reverse);
            KillTimer(hwnd, IDTIMER_Clockwise);
            dir = Direction::down;
            break;
        }
        break;

        }

    }
    break;

    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
} // LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 

звернути увагу, думаю, треба на case VK_RETURN:, case IDTIMER_Reverse:

37

(8 відповідей, залишених у C++)

Тема закрита. Коалі дякую!

38

(8 відповідей, залишених у C++)

А нащо?

Просто я подумав, що я роблю зайві маніпуляції: відкриваю потік, створюю файл, закриваю потік. І завася питанням чи не можна викинути операції з потоком з цього ланцюга. Одне діло якщо ми відкриваємо файл для вводу/виводу. А коли нам треба просто створити пустий файл (як би це безглуздо не було).

Можна ще проголошувати і створювати в одному рядку.

не зрозумів... а так:
ofstream someFile.open(fileName, ios_base::out);?

39

(8 відповідей, залишених у C++)

ітератори погано реагують на зміну контексту ітерації, такого краще не робити.

Що мене і цікавило.
Ми зараз вчимо вектори і нам поставили ось таку задачу. Як задачу поставили так я її і виконую. Стикнувся з проблемою і написав на форум, бо сподівався зрозуміти в чому причина проблеми (бо код працює якось вибірково - то він все переставляє без проблем, то забуває перенести значення).
Можна ще 2 питання:
1.

ітератори погано реагують на зміну контексту ітерації

. Це стосується переставляння вмісту вектора в самому собі чи при вставлянні з іншого вектора теж може виникнути подібна ситуація?
2. Можна якось створити файл не відкриваючи потік? Не використовуючи такий метод:

ofstream someFile;
        someFile.open(fileName, ios_base::out);
        someFile.close();

а якось просто створити файл? Я гуглив, прошу туди не відправляти.

40

(8 відповідей, залишених у C++)

Чудова допомога: обісрав, покритикував, сказав, що влом читати код і нічим не допоміг. Навіщо взагалі відписували? Я так теж можу.