1. 程式人生 > >OpenGL學習程式,建立一個3D的三角椎體和正方體並旋轉

OpenGL學習程式,建立一個3D的三角椎體和正方體並旋轉

近日看了兩個OpenGL ES的程式,看的雲裡霧裡的,意識到OpenGL ES是OpenGL的一個方面,所以任務學習OpenGL還是很有必要的,發現一個非常不錯的學習網站,這裡推薦給大家:http://www.owlei.com/DancingWind/Course/Tutorial_01.htm還有一個視訊學習的網站,這兩個都是外國友人編寫和錄製的,覺得為什麼經過外國人描述出來的東西就會特別容易理解,這一點還是需要學習的。還有要多看原文,不要看中文翻譯後的技術書,很多都被翻譯的很難了。
#include <windows.h>		// Windows的標頭檔案
#include <gl\gl.h>		// 包含最新的gl.h,glu.h庫
#include   <gl\glu.h>
#include	<stdio.h>							// 標準輸入/輸出庫的標頭檔案
#include	<glaux.h>							// GLaux庫的標頭檔案

HGLRC           hRC=NULL;							// 視窗著色描述表控制代碼
HDC             hDC=NULL;							// OpenGL渲染描述表控制代碼
HWND            hWnd=NULL;							// 儲存我們的視窗控制代碼
HINSTANCE       hInstance;							// 儲存程式的例項

   
bool	keys[256];								// 儲存鍵盤按鍵的陣列
bool	active=TRUE;								// 視窗的活動標誌,預設為TRUE
bool	fullscreen=TRUE;							// 全屏標誌預設,預設設定成全屏模式
GLfloat		rtri;						// 用於三角形的角度
GLfloat		rquad;						// 用於四邊形的角度

LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);				// WndProc的定義

AUX_RGBImageRec *LoadBMP(char *Filename)					// 載入點陣圖圖象
{
	FILE *File=NULL;							// 檔案控制代碼
if (!Filename)								// 確保檔名已提供
	{
		return NULL;							// 如果沒提供,返回 NULL


GLvoid ReSizeGLScene(GLsizei width, GLsizei height)				// 重置OpenGL視窗大小
{
	if (height==0)								// 防止被零除
	{
		height=1;							// 將Height設為1
	}
	glViewport(0, 0, width, height);					// 重置當前的視口
	glMatrixMode(GL_PROJECTION);						// 選擇投影矩陣
	glLoadIdentity();							// 重置投影矩陣
	// 設定視口的大小
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
	glMatrixMode(GL_MODELVIEW);						// 選擇模型觀察矩陣
	glLoadIdentity();	
}// 重置模型觀察矩陣
	int InitGL(GLvoid)								// 此處開始對OpenGL進行所有設定
	{
	glShadeModel(GL_SMOOTH);						// 啟用陰影平滑
	glClearColor(1.0f, 0.0f, 0.0f, 0.0f);					// 黑色背景
	glClearDepth(1.0f);							// 設定深度快取
	glEnable(GL_DEPTH_TEST);						// 啟用深度測試
	glDepthFunc(GL_LEQUAL);							// 所作深度測試的型別
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);			// 告訴系統對透視進行修正
	
	return TRUE;								// 初始化 OK
}

	int DrawGLScene(GLvoid)								// 從這裡開始進行所有的繪製
	{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);			// 清除螢幕和深度快取
	
	glLoadIdentity();							// 重置當前的模型觀察矩陣
	glTranslatef(-1.5f,0.0f,-6.0f);	   // 左移 1.5 單位,並移入螢幕 6.0
	glRotatef(rtri,0.0f,1.0f,0.0f);				// 繞Y軸旋轉三角形
	glBegin(GL_TRIANGLES);							// 繪製三角形	
		glColor3f(1.0f,0.0f,0.0f);			// 紅色
		glVertex3f( 0.0f, 1.0f, 0.0f);			// 三角形的上頂點 (前側面)
		glColor3f(0.0f,1.0f,0.0f);			// 綠色
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 三角形的左下頂點 (前側面)
		glColor3f(0.0f,0.0f,1.0f);			// 藍色
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 三角形的右下頂點 (前側面)


		glColor3f(1.0f,0.0f,0.0f);			// 紅色
		glVertex3f( 0.0f, 1.0f, 0.0f);			// 三角形的上頂點 (右側面)
		glColor3f(0.0f,0.0f,1.0f);			// 藍色
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 三角形的左下頂點 (右側面)
		glColor3f(0.0f,1.0f,0.0f);			// 綠色
		glVertex3f( 1.0f,-1.0f, -1.0f);			// 三角形的右下頂點 (右側面)

   
 
		glColor3f(1.0f,0.0f,0.0f);			// 紅色
		glVertex3f( 0.0f, 1.0f, 0.0f);			// 三角形的上頂點 (後側面)
		glColor3f(0.0f,1.0f,0.0f);			// 綠色
		glVertex3f( 1.0f,-1.0f, -1.0f);			// 三角形的左下頂點 (後側面)
		glColor3f(0.0f,0.0f,1.0f);			// 藍色
		glVertex3f(-1.0f,-1.0f, -1.0f);			// 三角形的右下頂點 (後側面)



		glColor3f(1.0f,0.0f,0.0f);			// 紅色
		glVertex3f( 0.0f, 1.0f, 0.0f);			// 三角形的上頂點 (左側面)
		glColor3f(0.0f,0.0f,1.0f);			// 藍色
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 三角形的左下頂點 (左側面)
		glColor3f(0.0f,1.0f,0.0f);			// 綠色
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 三角形的右下頂點 (左側面)
	glEnd();						// 金字塔繪製結束

		glLoadIdentity();
		glTranslatef(1.5f,0.0f,-7.0f);				// 先右移再移入螢幕
		glRotatef(rquad,1.0f,1.0f,1.0f);			// 在XYZ軸上旋轉立方體
		glBegin(GL_QUADS);					// 開始繪製立方體

		glColor3f(0.0f,1.0f,0.0f);			// 顏色改為藍色
		glVertex3f( 1.0f, 1.0f,-1.0f);			// 四邊形的右上頂點 (頂面)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// 四邊形的左上頂點 (頂面)
		glVertex3f(-1.0f, 1.0f, 1.0f);			// 四邊形的左下頂點 (頂面)
		glVertex3f( 1.0f, 1.0f, 1.0f);			// 四邊形的右下頂點 (頂面)

		glColor3f(1.0f,0.5f,0.0f);			// 顏色改成橙色
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 四邊形的右上頂點(底面)
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 四邊形的左上頂點(底面)
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 四邊形的左下頂點(底面)
		glVertex3f( 1.0f,-1.0f,-1.0f);			// 四邊形的右下頂點(底面)

		glColor3f(1.0f,0.0f,0.0f);			// 顏色改成紅色
		glVertex3f( 1.0f, 1.0f, 1.0f);			// 四邊形的右上頂點(前面)
		glVertex3f(-1.0f, 1.0f, 1.0f);			// 四邊形的左上頂點(前面)
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 四邊形的左下頂點(前面)
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 四邊形的右下頂點(前面)

		glColor3f(1.0f,1.0f,0.0f);			// 顏色改成黃色
		glVertex3f( 1.0f,-1.0f,-1.0f);			// 四邊形的右上頂點(後面)
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 四邊形的左上頂點(後面)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// 四邊形的左下頂點(後面)
		glVertex3f( 1.0f, 1.0f,-1.0f);			// 四邊形的右下頂點(後面)

 

		glColor3f(0.0f,0.0f,1.0f);			// 顏色改成藍色
		glVertex3f(-1.0f, 1.0f, 1.0f);			// 四邊形的右上頂點(左面)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// 四邊形的左上頂點(左面)
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 四邊形的左下頂點(左面)
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 四邊形的右下頂點(左面)


		glColor3f(1.0f,0.0f,1.0f);			// 顏色改成紫羅蘭色
		glVertex3f( 1.0f, 1.0f,-1.0f);			// 四邊形的右上頂點(右面)
		glVertex3f( 1.0f, 1.0f, 1.0f);			// 四邊形的左上頂點(右面)
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 四邊形的左下頂點(右面)
		glVertex3f( 1.0f,-1.0f,-1.0f);			// 四邊形的右下頂點(右面)
	glEnd();						// 立方體繪製結束

	rtri+=0.2f;						// 增加三角形的旋轉變數
	rquad-=0.15f;						// 減少四邊形的旋轉變數
	return TRUE;						// 繼續執行


}



	GLvoid KillGLWindow(GLvoid)							// 正常銷燬視窗
	{

   
		if (fullscreen)								// 我們處於全屏模式嗎?
		{
		ChangeDisplaySettings(NULL,0);					// 是的話,切換回桌面
		ShowCursor(TRUE);						// 顯示滑鼠指標
		}
		if (hRC)								// 我們擁有OpenGL渲染描述表嗎?
		{
		if (!wglMakeCurrent(NULL,NULL))					// 我們能否釋放DC和RC描述表?
		{
			MessageBox(NULL,"釋放DC或RC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
		}
		if (!wglDeleteContext(hRC))					// 我們能否刪除RC?
		{
			MessageBox(NULL,"釋放RC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
		}
		hRC=NULL;							// 將RC設為 NULL
	}

	if (hDC && !ReleaseDC(hWnd,hDC))					// 我們能否釋放 DC?
	{
		MessageBox(NULL,"釋放DC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
		hDC=NULL;							// 將 DC 設為 NULL
	}

	if (hWnd && !DestroyWindow(hWnd))					// 能否銷燬視窗?
	{
		MessageBox(NULL,"釋放視窗控制代碼失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
		hWnd=NULL;							// 將 hWnd 設為 NULL
	}

	if (!UnregisterClass("OpenG",hInstance))				// 能否登出類?
	{
		MessageBox(NULL,"不能登出視窗類。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
		hInstance=NULL;							// 將 hInstance 設為 NULL
	}
}

BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{

	GLuint		PixelFormat;						// 儲存查詢匹配的結果

	WNDCLASS	wc;							// 視窗類結構

	DWORD		dwExStyle;						// 擴充套件視窗風格
	DWORD		dwStyle;						// 視窗風格

	RECT WindowRect;							// 取得矩形的左上角和右下角的座標值
	WindowRect.left=(long)0;						// 將Left   設為 0
	WindowRect.right=(long)width;						// 將Right  設為要求的寬度
	WindowRect.top=(long)0;							// 將Top    設為 0
	WindowRect.bottom=(long)height;						// 將Bottom 設為要求的高度

	fullscreen=fullscreenflag;						// 設定全域性全屏標誌

	hInstance		= GetModuleHandle(NULL);			// 取得我們視窗的例項
	wc.style		= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;		// 移動時重畫,併為視窗取得DC
	wc.lpfnWndProc		= (WNDPROC) WndProc;				// WndProc處理訊息
	wc.cbClsExtra		= 0;						// 無額外視窗資料
	wc.cbWndExtra		= 0;						// 無額外視窗資料
	wc.hInstance		= hInstance;					// 設定例項
	wc.hIcon		= LoadIcon(NULL, IDI_WINLOGO);			// 裝入預設圖示
	wc.hCursor		= LoadCursor(NULL, IDC_ARROW);			// 裝入滑鼠指標
	wc.hbrBackground	= NULL;						// GL不需要背景
	wc.lpszMenuName		= NULL;						// 不需要選單
	wc.lpszClassName	= "OpenG";					// 設定類名字

   
	if (!RegisterClass(&wc))						// 嘗試註冊視窗類
	{
		MessageBox(NULL,"註冊視窗失敗","錯誤",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 退出並返回FALSE
	}

	if (fullscreen)								// 要嘗試全屏模式嗎?
	{

		DEVMODE dmScreenSettings;						// 裝置模式
		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));			// 確保記憶體清空為零
		dmScreenSettings.dmSize=sizeof(dmScreenSettings);			// Devmode 結構的大小
		dmScreenSettings.dmPelsWidth	= width;				// 所選螢幕寬度
		dmScreenSettings.dmPelsHeight	= height;				// 所選螢幕高度
		dmScreenSettings.dmBitsPerPel	= bits;					// 每象素所選的色彩深度
		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
	// 嘗試設定顯示模式並返回結果。注: CDS_FULLSCREEN 移去了狀態條。
		if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
		{
	// 若模式失敗,提供兩個選項:退出或在視窗內執行。
			if (MessageBox(NULL,"全屏模式在當前顯示卡上設定失敗!\n使用視窗模式?","NeHe G",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
			{
				fullscreen=FALSE;				// 選擇視窗模式(Fullscreen=FALSE)
			}
			else
			{
				// 彈出一個對話方塊,告訴使用者程式結束
				MessageBox(NULL,"程式將被關閉","錯誤",MB_OK|MB_ICONSTOP);
				return FALSE;					//  退出並返回 FALSE
			}
		}
	}

if (fullscreen)								// 仍處於全屏模式嗎?
	{
		dwExStyle=WS_EX_APPWINDOW;					// 擴充套件窗體風格
		dwStyle=WS_POPUP;						// 窗體風格
		ShowCursor(FALSE);						// 隱藏滑鼠指標
	}
	else
	{
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// 擴充套件窗體風格
		dwStyle=WS_OVERLAPPEDWINDOW;					//  窗體風格
	}

	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		// 調整視窗達到真正要求的大小
	if (!(hWnd=CreateWindowEx(	dwExStyle,				// 擴充套件窗體風格
					"OpenG",				// 類名字
					title,					// 視窗標題
					WS_CLIPSIBLINGS |			// 必須的窗體風格屬性
					WS_CLIPCHILDREN |			// 必須的窗體風格屬性
					dwStyle,				// 選擇的窗體屬性
					0, 0,					// 視窗位置
					WindowRect.right-WindowRect.left,	// 計算調整好的視窗寬度
					WindowRect.bottom-WindowRect.top,	// 計算調整好的視窗高度
					NULL,					// 無父視窗
					NULL,					// 無選單
					hInstance,				// 例項
					NULL)))					// 不向WM_CREATE傳遞任何東
	{
		KillGLWindow();							// 重置顯示區
		MessageBox(NULL,"不能建立一個視窗裝置描述表","錯誤",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 返回 FALSE
	}


	static	PIXELFORMATDESCRIPTOR pfd=					// /pfd 告訴視窗我們所希望的東東,即視窗使用的畫素格式
	{
		sizeof(PIXELFORMATDESCRIPTOR),					// 上述格式描述符的大小
		1,								// 版本號
		PFD_DRAW_TO_WINDOW |						// 格式支援視窗
		PFD_SUPPORT_OPENGL |						// 格式必須支援OpenGL
		PFD_DOUBLEBUFFER,						// 必須支援雙緩衝
		PFD_TYPE_RGBA,							// 申請 RGBA 格式
		bits,								// 選定色彩深度
		0, 0, 0, 0, 0, 0,						// 忽略的色彩位
		0,								// 無Alpha快取
		0,								// 忽略Shift Bit
		0,								// 無累加快取
		0, 0, 0, 0,							// 忽略聚集位
		16,								// 16位 Z-快取 (深度快取)
		0,								// 無蒙板快取
		0,								// 無輔助快取
		PFD_MAIN_PLANE,							// 主繪圖層
		0,								// Reserved
		0, 0, 0								// 忽略層遮罩
	};

	if (!(hDC=GetDC(hWnd)))							// 取得裝置描述表了麼?
	{
		KillGLWindow();							// 重置顯示區
		MessageBox(NULL,"不能建立一種相匹配的畫素格式","錯誤",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 返回 FALSE
	}

	if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))				// Windows 找到相應的象素格式了嗎?
	{
		KillGLWindow();							// 重置顯示區
		MessageBox(NULL,"不能設定畫素格式","錯誤",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 返回 FALSE
	}

	if(!SetPixelFormat(hDC,PixelFormat,&pfd))				// 能夠設定象素格式麼?
	{
		KillGLWindow();							// 重置顯示區
		MessageBox(NULL,"不能設定畫素格式","錯誤",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 返回 FALSE
	}

	if (!(hRC=wglCreateContext(hDC)))					// 能否取得著色描述表?
	{
		KillGLWindow();							// 重置顯示區
		MessageBox(NULL,"不能建立OpenGL渲染描述表","錯誤",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 返回 FALSE
	}


	if(!wglMakeCurrent(hDC,hRC))						// 嘗試啟用著色描述表
	{
		KillGLWindow();							// 重置顯示區
		MessageBox(NULL,"不能啟用當前的OpenGL渲然描述表","錯誤",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 返回 FALSE
	}

	ShowWindow(hWnd,SW_SHOW);						// 顯示視窗
	SetForegroundWindow(hWnd);						// 略略提高優先順序
	SetFocus(hWnd);								// 設定鍵盤的焦點至此視窗
	ReSizeGLScene(width, height);						// 設定透視 GL 螢幕

	if (!InitGL())								// 初始化新建的GL視窗
	{
		KillGLWindow();							// 重置顯示區
		MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// 返回 FALSE
	}


	return TRUE;								// 成功
}


LRESULT CALLBACK WndProc(	HWND	hWnd,					// 視窗的控制代碼
				UINT	uMsg,					// 視窗的訊息
				WPARAM	wParam,					// 附加的訊息內容
				LPARAM	lParam)					// 附加的訊息內容
{

	switch (uMsg)								// 檢查Windows訊息
	{


		case WM_ACTIVATE:						// 監視視窗啟用訊息
		{
			if (!HIWORD(wParam))					// 檢查最小化狀態
			{
				active=TRUE;					// 程式處於啟用狀態
			}
			else
			{
				active=FALSE;					// 程式不再啟用
			}

			return 0;						// 返回訊息迴圈
		}

		case WM_SYSCOMMAND:						// 系統中斷命令
		{
			switch (wParam)						// 檢查系統呼叫
			{
				case SC_SCREENSAVE:				// 屏保要執行?
				case SC_MONITORPOWER:				// 顯示器要進入節電模式?
				return 0;					// 阻止發生
			}
			break;							// 退出
		}

		case WM_CLOSE:							// 收到Close訊息?
		{
			PostQuitMessage(0);					// 發出退出訊息
			return 0;						// 返回
		}

		case WM_KEYDOWN:						// 有鍵按下麼?
		{
			keys[wParam] = TRUE;					// 如果是,設為TRUE
			return 0;						// 返回
		}

		case WM_KEYUP:							// 有鍵放開麼?
		{
			keys[wParam] = FALSE;					// 如果是,設為FALSE
			return 0;						// 返回
		}
	case WM_SIZE:							// 調整OpenGL視窗大小
		{
			ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));		// LoWord=Width,HiWord=Height
			return 0;						// 返回
		}
	}
	// 向 DefWindowProc傳遞所有未處理的訊息。
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}


int WINAPI WinMain(	HINSTANCE	hInstance,				// 當前視窗例項
			HINSTANCE	hPrevInstance,				// 前一個視窗例項
			LPSTR		lpCmdLine,				// 命令列引數
			int		nCmdShow)				// 視窗顯示狀態
{

	MSG	msg;								// Windowsx訊息結構
	BOOL	done=FALSE;							// 用來退出迴圈的Bool 變數

	// 提示使用者選擇執行模式
	if (MessageBox(NULL,"你想在全屏模式下執行麼?", "設定全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO)
	{
		fullscreen=FALSE;						// FALSE為視窗模式
	}

	// 建立OpenGL視窗
	if (!CreateGLWindow("NeHe's OpenGL程式框架",640,480,16,fullscreen))
	{
		return 0;							// 失敗退出
	}
	while(!done)								// 保持迴圈直到 done=TRUE
	{

		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))			// 有訊息在等待嗎?
		{

			if (msg.message==WM_QUIT)				// 收到退出訊息?
			{
				done=TRUE;					// 是,則done=TRUE
			}
			else							// 不是,處理視窗訊息
			{

				TranslateMessage(&msg);				// 翻譯訊息
				DispatchMessage(&msg);				// 傳送訊息
			}
		}
		else								// 如果沒有訊息
		{

			// 繪製場景。監視ESC鍵和來自DrawGLScene()的退出訊息
			if (active)						// 程式啟用的麼?
			{
				if (keys[VK_ESCAPE])				// ESC 按下了麼?
				{
					done=TRUE;				// ESC 發出退出訊號
				}
				else						// 不是退出的時候,重新整理螢幕
				{

   			DrawGLScene();				// 繪製場景
					SwapBuffers(hDC);			// 交換快取 (雙快取)
				}
			}


			if (keys[VK_F1])					// F1鍵按下了麼?
			{
				keys[VK_F1]=FALSE;				// 若是,使對應的Key陣列中的值為 FALSE
				KillGLWindow();					// 銷燬當前的視窗
				fullscreen=!fullscreen;				// 切換 全屏 / 視窗 模式
				// 重建 OpenGL 視窗
				if (!CreateGLWindow("NeHe's OpenGL 程式框架",640,480,16,fullscreen))
				{
					return 0;				// 如果視窗未能建立,程式退出
				}
			}
		}
	}


	// 關閉程式
	KillGLWindow();								// 銷燬視窗

return (msg.wParam);							// 退出程式
}

相關推薦

OpenGL學習程式建立一個3D三角正方體旋轉

近日看了兩個OpenGL ES的程式,看的雲裡霧裡的,意識到OpenGL ES是OpenGL的一個方面,所以任務學習OpenGL還是很有必要的,發現一個非常不錯的學習網站,這裡推薦給大家:http://www.owlei.com/DancingWind/Course/Tut

activiti工作流建立一個簡單的工作流審批

上一篇文章中,我們介紹了Activiti最簡單的流程,但是,我們知道,一般來講,審批一定有同意和不同意的區別,我們在這篇部落格中做一個簡單的Demo. 程式碼: 當然上一篇部落格中已經配置了基本的Activiti.cfg.xml和log4j.properties檔

程式執行時建立一個額外的輸出臺輸出程式內的Log以及除錯結果

需求描述:在做硬體除錯的時候,經常會需要用程式除錯具體問題處在哪裡,但是不斷重啟程式看日誌顯得繁瑣,想將日誌及除錯結果實時輸出。 解決方案:使用Kernel32.dll和user32.dll建立Console,使用控制檯實時輸出。在Main函式中新增實現程式碼

Python學習筆記一個 Python 程式

1. odbchelper.py def buildConnectionString(params): """Build a connection string from a dictionary of parameters. Ret

一個簡單的OpenGL程式繪製一個白色正方形

最近在學習OpenGL,也不知道要怎麼學才能學號,就一邊貼程式碼一邊記錄知識點吧。。。 這是一個非常簡單的OpenGL函式,顯示是個白色正方形。 程式碼: // Win32Project1hell

P68——編寫一個程式讀取一個浮點數先列印成再列印成如果系統......

#include <stdio.h> int main(void) { float a; printf("enter a floating-point value:"); scanf("%f",&a); printf("fixed-point notation:

在VSCode中建立一個.vue檔案的模板

具體步驟 1、使用Ctrl + Shift + P召喚出控制檯,然後輸入snippets並回車。 2、接下來輸入vue並選擇,VSCode會自動生成一個vue.json的檔案。這裡就是我們要輸入模板的地方了。 { /* // Place your snippets for Vue

編寫程式輸入一個年份判斷該年是否是閏年。如果是閏年輸出“yes”否則輸出“no”。 將下面的程式填寫完整。

撰寫人——軟工二班——陳喜平 題目描述 編寫程式,輸入一個年份,判斷該年是否是閏年。如果是閏年,輸出“yes”,否則輸出“no”。 將下面的程式填寫完整。 #include <stdio.h> int main() { int y; while (sc

設計一個具有陣列越界的異常處理的程式假設計算n個實數的用陣列存放。分別採用3種異常處理方式設計程式

Java三種不同的異常處理方法 第一種:不處理,交給jvm處理 package chuki; import java.util.*; public class one { public static void main(String[] args) { int n, sum = 0

使用最基礎的Node建立一個簡單的node.js應用

對於初學者 , 在我們使用 node.js建立應用時, 首先注意的應該是node.js的組成部分; 1:首先引入 require模組 可以使用require指令來載入node自己帶的node.js模組 ,方便引入;2: 2:建立伺服器: 伺服器可以監聽客戶端請求,從而響應資料

編寫一個程式指定一個資料夾能自動計算出其總容量

package filetest;import java.io.File;import java.io.IOException; public class FileEdit { double size=0.0; //計算檔案或資料夾的大小,單位MB public double getSize(File fi

一個程式輸入一個字串將組成字串的所有非英文字母的字元刪除後輸出

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String N=scanner.next

編寫一個程式一個整型陣列的元素求和結果使用全域性變數sum儲存另外對陣列元素中的奇數求和結果使用區域性變數sum儲存在主程式將兩個結果輸出。

#include<iostream> using namespace std; int sum_1(int a[]);//定義計算奇數的和; int main() { int a[]={1,2,3,4,5,6,7,8,9,10};//定義陣列並附初值; int i,sum=0,s

學習一個比掌握知識更重要的能力

我究竟該學什麼?   我一朋友的公司,專門給創業者提供創業培訓。有一天,他和我聊道, 現在創業者有一個普遍困擾,那就是不知道該學什麼好。   我說:為什麼?   他說:你想啊,創業者累成狗,本來時間就很少,結果創業方法今天出一個還沒弄明白,明天就又出來一個——根本學不過來啊!   我一聽,嘿嘿樂

編寫一段程式一個文字檔案的每一行前面新增行號一個新的檔案儲存新增 了行號的文字

檔案使用了fileinput的模組對它進行修改 import fileinput c=fileinput.input('6-2(3).txt',backup='.bak',inplace=1) for line in c: d=fileinput.filelineno()

寫出一個程式接受一個字串然後輸出該字串反轉後的字串

輸入描述: 輸入N個字元     輸出描述:輸出該字串反轉後的字串 #include <iostream>  #include <string> using namespace std; int main(){     string s ;    

寫出一個程式接受一個由字母數字組成的字串一個字元然後輸出輸入字串中含有該字元的個數。不區分大小寫。

輸入描述:輸入一個有字母和數字以及空格組成的字串,和一個字元。     輸出描述:輸出輸入字串中含有該字元的個數。 #include <string> #include <iostream> using namespace std; int main

根據使用者輸入的資料建立一個有序連結串列

步驟分析 分析: 建立連結串列是一個從無到有的過程。 空連結串列是有序的 只有一個結點的連結串列是有序的 把一個結點,加入到一個有序連結串列中去,使其仍然有序. 那麼我們就需要一個插入操作 **找插入位置** 從小到大順序 在連結串列中去找到

不使用迴圈建立一個長度為100的陣列使陣列的每個值等於它的下標(待更新)

這是我一道很早接觸的題目,整理過幾次都覺得不夠好。原出題人主要靠對es6語法的掌握,結果知乎大神們五花八門的答案真的重新整理我對JavaScript的認識。 這裡,先記錄長度較短的答案,以後再解釋難度較大的答案。 // 先建立一個長為100的稀疏陣列 let