компьютерный вопрос

Kirill89_3

Well-Known Member
10 Янв 2014
18,045
1,253
113
В базе создавались в смысле поля текстовые?
Какая база, если можно уточните.
Я в базах не очень низкоуровнево, и больше не с виндовым апи...но попробуем :))
Не в базе. Приложение win32 с++. Фильтрация изображений. Первая лаба по компьютерному зрению. У меня проблема с интерфейсом. Я хочу чтобы пользователь сначала ввел размер окна фильтра в диалоговом окне. А затем в зависимости от размера появилось n на m текстбоксов в процессе работы программы, динамически, куда пользователь вводит данные фильтра.


#include "stdafx.h"
#pragma once
namespace CV {


std::vector<float> NormalizationData(std::vector<unsigned char>Data);
std::vector<unsigned char> GrayFromNomralData(std::vector<float> NormalData);
std::vector<unsigned char> GrayFromColorData();



enum Mode { black, border, reflect };

class Filter
{

private:
std::vector<float> Data;
int Width, Height;

public:

Filter(int aWidth = 1, int aHeight = 1, std::vector<float> aData = {0,0,0,0,1,0,0,0,0 });


int GetWidht() const { return Width; }
int GetHeight() const { return Height; }

float GetValuePoint (int x, int y) const;
float GetVale(int x, int y);
void SetValuePoint(int x, int y, float value);


Filter& operator *=(const int a);
Filter& operator +=(const Filter &A);

friend Filter operator*(const Filter &A, const int b);
friend Filter operator+(const Filter &A, const Filter &B);


};

class Image
{

private:
std::vector<float> Data;
int Width, Height;
Mode Mode;

public:

Image(int aWidth, int aHeight, std::vector<float> aData, CV::Mode aMode=CV::black);

int GetWidht() const { return Width; }
int GetHeight() const { return Height; }
CV::Mode GetMode() const { return Mode; }

void SetMode(CV::Mode value) { Mode = value; }


float& GetPoint(int x, int y);
float GetValuePoint(int x, int y) const;
void SetValuePoint(int x, int y, float value);


Image& operator *=(const Filter &A);

friend Image operator*(const Image &A, const Filter &B);


};


}

#include "stdafx.h"
#include "Image.h"


CV::Image::Image(int aWidth, int aHeight, std::vector<float> aData, CV::Mode aMode)
{
if (aWidth*aHeight==aData.size()) {
Width = aWidth; Height = aHeight; Data = aData; Mode = aMode;
}
else throw std::invalid_argument("Width and height of the image are invalid");
}

float& CV::Image::GetPoint(int X, int Y) {

if (X>=0 && X<Width && Y>=0 && Y<Height)return Data[Width*Y + X];

else throw std::invalid_argument("Coordinates of the point of the image are invalid");
}

float CV::Image::GetValuePoint(int X, int Y)const {

if (X >= 0 && X<Width && Y >= 0 && Y<Height)return Data[Width*Y + X];

else

switch (Mode) {

case CV::black:return 0;

case CV::border: {

if(X<0)
if(Y<0)return Data[0];
else
if(Y>= Height) return Data[Width*(Height - 1)];
else return Data[Y*Width];
else
if(X>=Width)
if (Y<0)return Data[Width - 1];
else
if (Y >= Height) return Data[Width*Height - 1];
else return Data[Y*Width + Width - 1];
else
if(Y<0)return Data[X];
else return Data[X + (Height - 1)*Width];




}

case CV::reflect: {
if (X<0)
if (Y<0)return Data[0];
else
if (Y >= Height) return Data[Width*(Height - 1)];
else return Data[Y*Width];
else
if (X >= Width)
if (Y<0)return Data[Width - 1];
else
if (Y >= Height) return Data[Width*Height - 1];
else return Data[Y*Width + Width - 1];
else
if (Y<0)return Data[X];
else return Data[X + (Height - 1)*Width];


}

}

}

void CV::Image::SetValuePoint(int X, int Y, float value) {

if (X >= 0 && X < Width && Y >= 0 && Y < Height)
if (value >= 0 && value <= 1)
Data[Width*Y + X] = value;

else throw std::invalid_argument("Value is not normal");

else throw std::invalid_argument("Coordinates of the point of the image are invalid");
}

CV::Image& CV::Image::eek:perator*=(const CV::Filter &A)
{
float value;
for (int i = 0; i < Height; i++)
for (int j = 0; j < Width; j++) {
value = 0;
for (int ki = -A.GetHeight(); ki <= A.GetHeight(); ki++)
for (int kj = -A.GetWidht(); kj <= A.GetWidht(); kj++)
value += GetValuePoint(j + kj, i + ki)*A.GetValuePoint(kj, ki);
if (value > 1.0) value = 1.0; else if (value < 0.0)value = 0.0;
GetPoint(j, i) = value;
}
}




CV::Filter::Filter(int aWidth, int aHeight, std::vector<float> aData)
{
if ((aWidth*2+1)*(aHeight*2+1) == aData.size()) {
Width = aWidth; Height = aHeight; Data = aData;
}
else throw std::invalid_argument("Width and height of the filter are invalid");
}

float CV::Filter::GetValuePoint(int X, int Y)const {

if (X >=-Width && X<=Width && Y >=-Height && Y<=Height) return Data[(Width*2+1)*(Y+Height) + X+Width];

else throw std::invalid_argument("Coordinates of the filter are invalid");
}

void CV::Filter::SetValuePoint(int X, int Y, float value) {

if (X >= -Width && X <= Width && Y >= -Height && Y <= Height)
if (value >= 0)
Data[(Width * 2 + 1)*(Y + Height) + X + Width] = value;

else throw std::invalid_argument("Value is negative");

else throw std::invalid_argument("Coordinates of the point of the filter are invalid");
}

CV::Filter & CV::Filter::eek:perator*=(const int a)
{

}

CV::Image CV::eek:perator*(const Image & A, const Filter & B)
{
Image C = A;

float value;
for (int i = 0; i < C.Height; i++)
for (int j = 0; j < C.Width; j++) {
value = 0;
for (int ki = -B.GetHeight(); ki <= B.GetHeight(); ki++)
for (int kj = -B.GetWidht(); kj <= B.GetWidht(); kj++)
value += C.GetValuePoint(j+kj, i + ki)*B.GetValuePoint(kj, ki);
if (value > 1.0) value = 1.0; else if (value < 0.0)value = 0.0;
C.GetPoint(j, i) = value;
}

return C;
}



// CV.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "CV.h"
#include <gdiplus.h>
#include <gdiplusgraphics.h>
#include <shobjidl_core.h>

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна

Bitmap *Image = NULL;
WCHAR* FileName = NULL;
Gdiplus::Color White(255, 255, 255, 255);
Graphics *graphic = NULL;

// Отправить объявления функций, включенных в этот модуль кода:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.

// Инициализация глобальных строк
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_CV, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CV));

MSG msg;

Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// Цикл основного сообщения:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Gdiplus::GdiplusShutdown(gdiplusToken);

return (int) msg.wParam;
}



//
// ФУНКЦИЯ: MyRegisterClass()
//
// НАЗНАЧЕНИЕ: регистрирует класс окна.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW 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_CV));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_CV);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassExW(&wcex);
}

//
// ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
// КОММЕНТАРИИ:
//
// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
// создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
//
// WM_COMMAND — обработать меню приложения
// WM_PAINT — отрисовать главное окно
// WM_DESTROY — отправить сообщение о выходе и вернуться
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{



switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case IDM_OPEN:

FileName = FileOpen();
graphic = new Graphics(GetDC(hWnd));
graphic->Clear(White);
delete graphic;
Image = Bitmap::FromFile(FileName, 0);
InvalidateRect(hWnd, NULL, false);
break;

case IDM_FILTER:
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Filter);


case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

graphic = new Graphics(hdc);


if (Image)graphic->DrawImage(Image, 10, 10);

delete graphic;

EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Filter(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
LPSTR buffer = new char[6];

static int k;
static vector<

switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDC_APPLY)
{

GetDlgItemTextA(hDlg, IDC_EDIT_K, buffer, 6);
k= atoi(buffer);
delete[]buffer;




};
}
return (INT_PTR)FALSE;
}


PWSTR FileOpen() {
PWSTR FileName = NULL;
IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr)) {
COMDLG_FILTERSPEC Filter[] = { L"images", L"*.bmp;*.jpg;*.jpeg" };
DWORD dwFlags;
IShellItem *ResultOfDialog;


pfd->GetOptions(&dwFlags);
pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM);
pfd->SetFileTypes(ARRAYSIZE(Filter), Filter);
pfd->Show(NULL);
if (SUCCEEDED(pfd->GetResult(&ResultOfDialog))) {
ResultOfDialog->GetDisplayName(SIGDN_FILESYSPATH, &FileName);
pfd->Release();
ResultOfDialog->Release();
}
}
return FileName;
}
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54
А. понял примерно!
Если можно - пользуйтесь, пожалуйста, вставкой кода - там же, где вставка цитирования и мультимедиа!
Разбираться надо, я с налёту не понял, сорри :)
Тем более там ещё и смайлики вылезли не по делу :)
Но это я к слову - не понял не от этого.
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54

Kirill89_3

Well-Known Member
10 Янв 2014
18,045
1,253
113
А. понял примерно!
Если можно - пользуйтесь, пожалуйста, вставкой кода - там же, где вставка цитирования и мультимедиа!
Разбираться надо, я с налёту не понял, сорри :)
Тем более там ещё и смайлики вылезли не по делу :)
Но это я к слову - не понял не от этого.
Да, вставка кода хорошая опция, он там все подсвечивает, как в среде разработки.

C++:
#include "stdafx.h"
#pragma once
namespace CV {


std::vector<float> NormalizationData(std::vector<unsigned char>Data);
std::vector<unsigned char> GrayFromNomralData(std::vector<float> NormalData);
std::vector<unsigned char> GrayFromColorData();



enum Mode { black, border, reflect };

class Filter
{

private:
std::vector<float> Data;
int Width, Height;

public:

Filter(int aWidth = 1, int aHeight = 1, std::vector<float> aData = {0,0,0,0,1,0,0,0,0 });


int GetWidht() const { return Width; }
int GetHeight() const { return Height; }

float GetValuePoint (int x, int y) const;
float GetVale(int x, int y);
void SetValuePoint(int x, int y, float value);


Filter& operator *=(const int a);
Filter& operator +=(const Filter &A);

friend Filter operator*(const Filter &A, const int b);
friend Filter operator+(const Filter &A, const Filter &B);


};

class Image
{

private:
std::vector<float> Data;
int Width, Height;
Mode Mode;

public:

Image(int aWidth, int aHeight, std::vector<float> aData, CV::Mode aMode=CV::black);

int GetWidht() const { return Width; }
int GetHeight() const { return Height; }
CV::Mode GetMode() const { return Mode; }

void SetMode(CV::Mode value) { Mode = value; }


float& GetPoint(int x, int y);
float GetValuePoint(int x, int y) const;
void SetValuePoint(int x, int y, float value);


Image& operator *=(const Filter &A);

friend Image operator*(const Image &A, const Filter &B);


};


}

#include "stdafx.h"
#include "Image.h"


CV::Image::Image(int aWidth, int aHeight, std::vector<float> aData, CV::Mode aMode)
{
if (aWidth*aHeight==aData.size()) {
Width = aWidth; Height = aHeight; Data = aData; Mode = aMode;
}
else throw std::invalid_argument("Width and height of the image are invalid");
}

float& CV::Image::GetPoint(int X, int Y) {

if (X>=0 && X<Width && Y>=0 && Y<Height)return Data[Width*Y + X];

else throw std::invalid_argument("Coordinates of the point of the image are invalid");
}

float CV::Image::GetValuePoint(int X, int Y)const {

if (X >= 0 && X<Width && Y >= 0 && Y<Height)return Data[Width*Y + X];

else

switch (Mode) {

case CV::black:return 0;

case CV::border: {

if(X<0)
if(Y<0)return Data[0];
else
if(Y>= Height) return Data[Width*(Height - 1)];
else return Data[Y*Width];
else
if(X>=Width)
if (Y<0)return Data[Width - 1];
else
if (Y >= Height) return Data[Width*Height - 1];
else return Data[Y*Width + Width - 1];
else
if(Y<0)return Data[X];
else return Data[X + (Height - 1)*Width];




}

case CV::reflect: {
if (X<0)
if (Y<0)return Data[0];
else
if (Y >= Height) return Data[Width*(Height - 1)];
else return Data[Y*Width];
else
if (X >= Width)
if (Y<0)return Data[Width - 1];
else
if (Y >= Height) return Data[Width*Height - 1];
else return Data[Y*Width + Width - 1];
else
if (Y<0)return Data[X];
else return Data[X + (Height - 1)*Width];


}

}

}

void CV::Image::SetValuePoint(int X, int Y, float value) {

if (X >= 0 && X < Width && Y >= 0 && Y < Height)
if (value >= 0 && value <= 1)
Data[Width*Y + X] = value;

else throw std::invalid_argument("Value is not normal");

else throw std::invalid_argument("Coordinates of the point of the image are invalid");
}

CV::Image& CV::Image::eek:perator*=(const CV::Filter &A)
{
float value;
for (int i = 0; i < Height; i++)
for (int j = 0; j < Width; j++) {
value = 0;
for (int ki = -A.GetHeight(); ki <= A.GetHeight(); ki++)
for (int kj = -A.GetWidht(); kj <= A.GetWidht(); kj++)
value += GetValuePoint(j + kj, i + ki)*A.GetValuePoint(kj, ki);
if (value > 1.0) value = 1.0; else if (value < 0.0)value = 0.0;
GetPoint(j, i) = value;
}
}




CV::Filter::Filter(int aWidth, int aHeight, std::vector<float> aData)
{
if ((aWidth*2+1)*(aHeight*2+1) == aData.size()) {
Width = aWidth; Height = aHeight; Data = aData;
}
else throw std::invalid_argument("Width and height of the filter are invalid");
}

float CV::Filter::GetValuePoint(int X, int Y)const {

if (X >=-Width && X<=Width && Y >=-Height && Y<=Height) return Data[(Width*2+1)*(Y+Height) + X+Width];

else throw std::invalid_argument("Coordinates of the filter are invalid");
}

void CV::Filter::SetValuePoint(int X, int Y, float value) {

if (X >= -Width && X <= Width && Y >= -Height && Y <= Height)
if (value >= 0)
Data[(Width * 2 + 1)*(Y + Height) + X + Width] = value;

else throw std::invalid_argument("Value is negative");

else throw std::invalid_argument("Coordinates of the point of the filter are invalid");
}

CV::Filter & CV::Filter::eek:perator*=(const int a)
{

}

CV::Image CV::eek:perator*(const Image & A, const Filter & B)
{
Image C = A;

float value;
for (int i = 0; i < C.Height; i++)
for (int j = 0; j < C.Width; j++) {
value = 0;
for (int ki = -B.GetHeight(); ki <= B.GetHeight(); ki++)
for (int kj = -B.GetWidht(); kj <= B.GetWidht(); kj++)
value += C.GetValuePoint(j+kj, i + ki)*B.GetValuePoint(kj, ki);
if (value > 1.0) value = 1.0; else if (value < 0.0)value = 0.0;
C.GetPoint(j, i) = value;
}

return C;
}



// CV.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "CV.h"
#include <gdiplus.h>
#include <gdiplusgraphics.h>
#include <shobjidl_core.h>

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна

Bitmap *Image = NULL;
WCHAR* FileName = NULL;
Gdiplus::Color White(255, 255, 255, 255);
Graphics *graphic = NULL;

// Отправить объявления функций, включенных в этот модуль кода:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.

// Инициализация глобальных строк
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_CV, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CV));

MSG msg;

Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// Цикл основного сообщения:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Gdiplus::GdiplusShutdown(gdiplusToken);

return (int) msg.wParam;
}



//
// ФУНКЦИЯ: MyRegisterClass()
//
// НАЗНАЧЕНИЕ: регистрирует класс окна.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW 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_CV));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_CV);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassExW(&wcex);
}

//
// ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
// КОММЕНТАРИИ:
//
// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
// создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
//
// WM_COMMAND — обработать меню приложения
// WM_PAINT — отрисовать главное окно
// WM_DESTROY — отправить сообщение о выходе и вернуться
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{



switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case IDM_OPEN:

FileName = FileOpen();
graphic = new Graphics(GetDC(hWnd));
graphic->Clear(White);
delete graphic;
Image = Bitmap::FromFile(FileName, 0);
InvalidateRect(hWnd, NULL, false);
break;

case IDM_FILTER:
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Filter);


case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

graphic = new Graphics(hdc);


if (Image)graphic->DrawImage(Image, 10, 10);

delete graphic;

EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Filter(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
LPSTR buffer = new char[6];

static int k;
static vector<

switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDC_APPLY)
{

GetDlgItemTextA(hDlg, IDC_EDIT_K, buffer, 6);
k= atoi(buffer);
delete[]buffer;




};
}
return (INT_PTR)FALSE;
}


PWSTR FileOpen() {
PWSTR FileName = NULL;
IFileDialog *pfd = NULL;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr)) {
COMDLG_FILTERSPEC Filter[] = { L"images", L"*.bmp;*.jpg;*.jpeg" };
DWORD dwFlags;
IShellItem *ResultOfDialog;


pfd->GetOptions(&dwFlags);
pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM);
pfd->SetFileTypes(ARRAYSIZE(Filter), Filter);
pfd->Show(NULL);
if (SUCCEEDED(pfd->GetResult(&ResultOfDialog))) {
ResultOfDialog->GetDisplayName(SIGDN_FILESYSPATH, &FileName);
pfd->Release();
ResultOfDialog->Release();
}
}
return FileName;
}
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54
oLive
Вышел из комментов по реакт-оси.
Приглашаю всех желающих погонять ReactOS LiveCD в виртуалке c компа или мобильника воспользоваться бесплатной, анонимной виртуальной машиной oLive:
Доступ сбрасывается каждые 2 часа. Интернета нет. Протокол доступа: SPICE.


Сразу предупреждаю ReactOS LiveCD по сравнению с дистрибутивами GNU/Linux смотрится весьма аскетично так как нет предустановленных сторонних программ.
 

Kirill89_3

Well-Known Member
10 Янв 2014
18,045
1,253
113
Эээх, тяжко программировать на с++ win32, решил подняться на более высокий уровень, буду использовать с++ mfc Microsoft Foundation Classes — Википедия Странно что в стандартном пакете установки visual studio 2017 нет шаблона для mfc проектов, надо дополнительно скачивать. Предлагают в Microsoft всем на С#. net писать? А если любитель с++, то только хардкор - только win32, win64. :)
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54

Kirill89_3

Well-Known Member
10 Янв 2014
18,045
1,253
113
Надо конвертировать цветное изображение в изображение с 255 оттенками серого.

В инете нашел такой код, но мне он не нравится, так как он меняет старое изображение, а не создает новое из старого, а также не менят формат изображения: как было 3 байта на пиксел, так и остается.

C++:
BOOL CGrayScaleDlg::GrayScale(CBitmap &bmp)
{
BOOL bRet = FALSE;
if( bmp.GetSafeHandle() )
{
BITMAP bp;
bmp.GetBitmap(&bp);
if( bp.bmBitsPixel == 24 ) // else not supported
{
long dwCount = bp.bmWidthBytes*bp.bmHeight;
BYTE* lpBits = new BYTE[dwCount];
ZeroMemory(lpBits,dwCount);
bmp.GetBitmapBits( dwCount, lpBits );

long nCol = 0, nRow=0;
long nLineWidth = bp.bmWidthBytes;
BYTE r,g,b;
BYTE gray;
for(long i=0; i<=dwCount-3; i+=3,nCol+=3)
{
b = BYTE(0.114*lpBits[i]);
g = BYTE(0.587*lpBits[i+1]);
r = BYTE(0.299*lpBits[i+2]);
gray = b+g+r;
lpBits[i]    = gray ;
lpBits[i+1] = gray ;
lpBits[i+2] = gray ;
if( nCol >= nLineWidth)
{
nRow++;
nCol = 0;
i=nRow*nLineWidth;
}
}
bRet = (bmp.SetBitmapBits( dwCount, lpBits ) >= 0);
delete [] lpBits;
}

}
return bRet;
}
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54
Действительно не то...портит старый файл и формат по сути старый.
Подумаем.
Но интереснее другое, обратное - берем Grey и нейросеть его разукрашивает...
Показываем цветное, и она учится...
 

Kirill89_3

Well-Known Member
10 Янв 2014
18,045
1,253
113
Действительно не то...портит старый файл и формат по сути старый.
Подумаем.
Но интереснее другое, обратное - берем Grey и нейросеть его разукрашивает...
Показываем цветное, и она учится...
Ну на таком уровне все прикольно и интересно. А вот когда программируешь своими руками, то надо каждую деталь знать, и у новичков в таком случае всякий энтузиазм может пройти. Я вот раньше думал, что из цветного в grey перевести легко, думать не надо, а вот нет :)
В общем я понял, что надо чуть ли не спать со Страуструпом, чтобы преуспеть в программировании. В последнее время стараюсь так и делать. :) Вчера ложился спать, читая C++.
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54
Ну на таком уровне все прикольно и интересно. А вот когда программируешь своими руками, то надо каждую деталь знать, и у новичков в таком случае всякий энтузиазм может пройти. Я вот раньше думал, что из цветного в grey перевести легко, думать не надо, а вот нет :)
В общем я понял, что надо чуть ли не спать со Страуструпом, чтобы преуспеть в программировании. В последнее время стараюсь так и делать. :) Вчера ложился спать, читая C++.
Ага, и кстати.. практика с теорией - друзья навек, согласны?
В сексологии аналогично :))
 

Kirill89_3

Well-Known Member
10 Янв 2014
18,045
1,253
113
Ага, и кстати.. практика с теорией - друзья навек, согласны?
В сексологии аналогично :))
А разве в сексологии или психиатрии есть какая-то практика? Там же в основном работа языком в произвольной форме идет, как в философии, надо правильные слова подбирать. Это же не хирургия.
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54
А разве в сексологии или психиатрии есть какая-то практика? Там же в основном работа языком в произвольной форме идет, как в философии, надо правильные слова подбирать. Это же не хирургия.
Есть :))

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

Kirill89_3

Well-Known Member
10 Янв 2014
18,045
1,253
113
Есть :))

Начиная с массовой сексологии, где каждый этап психосексуального развития включает в себя как теоретические мечты с фантазиями, так практическую реализацию.
На каждом этапе!
Так это практика у конкретного человека. Если женщина забеременела, то это не сделало ее гинекологом, правильно? Женщина может забеременеть даже в коме. Я вот больший сексолог, чем многие люди, но опыта очень мало что у меня.
 
Последнее редактирование:

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54
Так это практика у конкретного человека. Если женщина забеременела, то это не сделало ее гинекологом, правильно? Женщина может забеременеть даже в коме. Я вот больший сексолог, чем многие люди, но опыта очень мало что у меня.
Практика в беременности (умение ходить беременность и правильно любить еще нерожденного ребенка) и практика в лечении "женских" болезней- весьма разные вещи.
Так же как ходьба, например - и лечение суставов ног.
При этом эти умения могут сочетаться, а могут и не сочетаться!
Скажем женщина -гинеколог может не рожать, не иметь опыта в беременности , или иметь негативный опыт. А вот лечить разные воспаления гениталий - вполне умеет. Как и наоборот:) Родила десятерых, а "двуручное обследование " провести не сможет..
Или - ходить умеет человек, а лечить суставы - не умееет.
Это - разное.
И в том и в другом случае нужна и теория и практика. Да, и ходить некоторые люди, к примеру после ДЦП - учатся с теорией. И лечить ноги - тоже с теорией. Однако без практики...теория ходьбы или фармакология НПВС - недостаточны для _результата_.

Примерно так?
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54
А есть компьютерная программа по оптимизации аутогинефильного удовольствия? Дидло с Wi Fi скажем с подключением в инет.
Хм, а для кого я выкладываю (_на форуме_) такие вещи из ВР? ;)
 

dok34.ru

Каюр тяжёлых систем
7 Фев 2010
79,687
2,477
113
54