Консультация № 187272
10.04.2013, 14:37
195.00 руб.
0 12 0
Здравствуйте! У меня возникли сложности с таким вопросом:
Очень нужно! Помогите создать Windows Forms, можно решить С#, С++, но нужно указать какой язык используете. Шифр зачётной книжки через textbox.
Microsoft Visual Studio.

Пример работы

Обсуждение

Неизвестный
10.04.2013, 20:01
общий
Aij вводить через ScrollBar в интервале от 1 до 40

Что-то мне подсказывает, что всего шагов получается 1600...
Неизвестный
10.04.2013, 20:22
общий
10.04.2013, 20:24
Цитата: 181465
Aij вводить через ScrollBar в интервале от 1 до 40
Что-то мне подсказывает, что всего шагов получается 1600...


Вы имеете ввиду i*J (40*40)? Скорей всего Aij отдельное число, шагов будет 40
давно
Посетитель
7438
7205
10.04.2013, 21:51
общий
Что представляет собой "шифр зачетной книжки"? В каких пределах?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.04.2013, 23:17
общий
10.04.2013, 23:18
Цитата: Лысков Игорь Витальевич
Что представляет собой "шифр зачетной книжки"? В каких пределах?

3 цифры от 000 до 999
по умолчанию можно поставить 364
Неизвестный
11.04.2013, 07:22
общий
Что-то непонятно... а как переводить данную функцию в графику?
Т.е. на выходе что-то [-A, A], и как это переводить в [0, 255]? Линейным преобразованием?
И если А - это одно число, то что там вводится по скроллбару на 40 шагов? о_о
Неизвестный
11.04.2013, 07:31
общий
х и у в каком интервале меняются?
Неизвестный
11.04.2013, 08:40
общий
11.04.2013, 09:06
т.е. получается, чтоб получить симмертричную картинку, х и у должны меняться в симметричном интервале [-n, n]
Аij идёт как множитель для косинусов и на форму картинки влиятет чисто как масштаб.
В косинусах большие C и L "сбивают" аргумент ближе к 0, что в результате даёт большое белое пятно на картинке. Как там кольцо получилось, я не понимаю... Если уменьшить L получается красивая такая решётка.
Неизвестный
11.04.2013, 19:21
общий
11.04.2013, 19:22
[q=181465][/q]
При i и j =1 получится круг, а например при 2, 2 получится 4 круга
Aij число которое можно при решении поменять вручную
График функции строится на форме в пределах плоскости построения имеющей размеры в
количестве пикселей соответственно меняются x и y и в 0-255 ничего не переводится.
Неизвестный
14.04.2013, 21:26
общий
Неужели никто не поможет сделать
Неизвестный
15.04.2013, 06:32
общий
У меня другая какая-то картинка получилась, и у меня нету Windows Forms (я не умею с ними работать), я на Win32API делал, и без скроллбаров. Могу код отдать.
Неизвестный
15.04.2013, 11:34
общий
давайте хуже всё равно не будет, придётся значит самому делать
Неизвестный
15.04.2013, 11:56
общий
вот оно.

Параметры i и j задаются прямо в обработчике WM_PAINT, там же в цикле задаётся А (оно там как массив, я его так изначально "увидел")

Там же в цикле я перевожу полученное значение функции из интервала [-A, A] в [0, 255] и из него делаю серый цвет RGB(bt, bt, bt), и его вывожу на экран через массив точек (чтоб быстрее было)

ex, ey - размеры области рисования
im - множитель-квадратизатор :)

Программа сделана в VC++ 6.0, Win32API (т.е. можно создать простой проект Win32, вставить в основной cpp-файл этот код, и оно заработает)

Код:

#include "stdafx.h"
#include <commctrl.h>
#include <math.h>

#pragma comment(lib, "comctl32.lib")

double A[40][40] = {0};
double pi = 3.14159265358979323846264338327950288419716939937510;


// DLG PROCEDURE -----------------------------------------------
// процедура обработки сообщений диалогового окна
LRESULT CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch(wmId)
{
// если нажали [x]
case IDCANCEL:
if(IDOK == MessageBox(hWnd, "quit ?", "confirmation", MB_OKCANCEL|MB_DEFBUTTON2|MB_ICONQUESTION))
PostQuitMessage(0);
break;
}
}
break;
case WM_PAINT:
{
RECT rc;
GetClientRect(hWnd, &rc);

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HDC cdc = CreateCompatibleDC(hdc);
HBITMAP hBmp = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
HBITMAP hBmpOld = (HBITMAP)SelectObject(cdc, hBmp);
//

double L = 2.0*364;
double C = 0.8*L;

int ex = 450;
int ey = 450;

BYTE bt;
DWORD dwClr;
double dbl1, dbl2;

int i=3;
int j=3;

double iPow = i%2?-1.0:1.0;
double jPow = j%2?-1.0:1.0;

int im = 1;
DWORD *lpdw = (DWORD *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ex*ey*4*im*im);

for(int y=0; y<ey; y++)
{
for(int x=0; x<ex; x++)
{
A[i][j] = 125.0;
dbl1 = cos( pi*(double)i*(x-ex/2)/L/1 - (1.0+iPow)*pi/4 );
dbl2 = cos( pi*(double)j*(y-ey/2)/C/1 - (1.0+jPow)*pi/4 );


dbl1 = (A[i][j] * dbl1 * dbl2);
dbl1 = (dbl1 + A[i][j]); // shift
bt = (BYTE)(255* dbl1 / (2*A[i][j])); // align
dwClr = RGB(bt, bt, bt);
//dwClr = (0xffffff)*(dbl1)/(2*A[i][j]); // align

for(int iy =0; iy<im; iy++)
{
for(int ix =0; ix<im; ix++)
{
*(lpdw + (ix + x*im + (y*im+iy)*ex*im)) = 0xff000000 | dwClr;
}
}
}
}

int cx = ex*im;
int cy = ey*im;

BITMAPINFO bi;
memset(&bi, 0, sizeof BITMAPINFO);
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biWidth = cx;
bi.bmiHeader.biHeight = -(int)cy;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biCompression = 0;
bi.bmiHeader.biSizeImage = cx*cy*bi.bmiHeader.biBitCount/8;
SetDIBitsToDevice(cdc, 0, 0, cx, cy, 0, 0, 0, cy, lpdw, (BITMAPINFO *)&bi, DIB_RGB_COLORS);
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, lpdw);

BitBlt(hdc, 0, 0, rc.right, rc.bottom, cdc, 0, 0, SRCCOPY);
SelectObject(cdc, hBmpOld);
DeleteObject(hBmp);
DeleteDC(cdc);

EndPaint(hWnd, &ps);
}
break;
}
return 0;
}


int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// создаём диалоговое окно и кнопку [Go!]
HWND hWndMain = CreateWindowEx(/*WS_EX_TOPMOST*/0, "#32770", "Main window", WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_CLIPCHILDREN|DS_3DLOOK, 300, 300, 470, 490, NULL, NULL, GetModuleHandle(NULL), NULL);
// приписываем функцию обработки к нашему дилоговому окну
SetWindowLong(hWndMain, DWL_DLGPROC, (long)DlgProc);

InitCommonControls();

// стандартный цикл обрабоки сообщений Windows для приложения
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if(!IsDialogMessage(hWndMain, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// если все окна закрыты - выходим
if(!IsWindow(hWndMain))
break;
}

return 0;
}
Форма ответа