- enhancement: use token list instead of single string to do code completion ( intial version)
- fix: language options in the project wizard don't work - fix: "ake as default language" option in the project wizard doesn't work
5
NEWS.md
|
@ -1,3 +1,8 @@
|
||||||
|
Version 0.11.0 For Dev-C++ 7 Beta
|
||||||
|
- enhancement: use token list instead of single string to do code completion ( intial version)
|
||||||
|
- fix: language options in the project wizard don't work
|
||||||
|
- fix: "ake as default language" option in the project wizard doesn't work
|
||||||
|
|
||||||
Version 0.10.4 For Dev-C++ 7 Beta
|
Version 0.10.4 For Dev-C++ 7 Beta
|
||||||
- fix: can't correctly undo/redo indent
|
- fix: can't correctly undo/redo indent
|
||||||
- fix: can't correctly undo/redo unindent
|
- fix: can't correctly undo/redo unindent
|
||||||
|
|
|
@ -4594,6 +4594,10 @@ void MainWindow::on_actionNew_Project_triggered()
|
||||||
{
|
{
|
||||||
NewProjectDialog dialog;
|
NewProjectDialog dialog;
|
||||||
if (dialog.exec() == QDialog::Accepted) {
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
|
if (dialog.makeDefaultLanguage()) {
|
||||||
|
pSettings->editor().setDefaultFileCpp(dialog.isCppProject());
|
||||||
|
pSettings->editor().save();
|
||||||
|
}
|
||||||
if (dialog.useAsDefaultProjectDir()) {
|
if (dialog.useAsDefaultProjectDir()) {
|
||||||
pSettings->dirs().setProjectDir(dialog.getLocation());
|
pSettings->dirs().setProjectDir(dialog.getLocation());
|
||||||
pSettings->dirs().save();
|
pSettings->dirs().save();
|
||||||
|
@ -4656,14 +4660,13 @@ void MainWindow::on_actionNew_Project_triggered()
|
||||||
|
|
||||||
// Create an empty project
|
// Create an empty project
|
||||||
mProject = std::make_shared<Project>(s,dialog.getProjectName());
|
mProject = std::make_shared<Project>(s,dialog.getProjectName());
|
||||||
if (!mProject->assignTemplate(dialog.getTemplate())) {
|
if (!mProject->assignTemplate(dialog.getTemplate(),dialog.isCppProject())) {
|
||||||
mProject = nullptr;
|
mProject = nullptr;
|
||||||
QMessageBox::critical(this,
|
QMessageBox::critical(this,
|
||||||
tr("New project fail"),
|
tr("New project fail"),
|
||||||
tr("Can't assign project template"),
|
tr("Can't assign project template"),
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
}
|
}
|
||||||
mProject->options().useGPP = dialog.isCppProject();
|
|
||||||
mProject->saveAll();
|
mProject->saveAll();
|
||||||
updateProjectView();
|
updateProjectView();
|
||||||
}
|
}
|
||||||
|
|
|
@ -624,14 +624,14 @@ void Project::setCompilerSet(int compilerSetIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate)
|
bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, bool useCpp)
|
||||||
{
|
{
|
||||||
if (!aTemplate) {
|
if (!aTemplate) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
mOptions = aTemplate->options();
|
mOptions = aTemplate->options();
|
||||||
mOptions.compilerSet = pSettings->compilerSets().defaultIndex();
|
mOptions.compilerSet = pSettings->compilerSets().defaultIndex();
|
||||||
|
mOptions.useGPP = useCpp;
|
||||||
updateCompilerSetType();
|
updateCompilerSetType();
|
||||||
mOptions.icon = aTemplate->icon();
|
mOptions.icon = aTemplate->icon();
|
||||||
|
|
||||||
|
@ -653,7 +653,7 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate)
|
||||||
PTemplateUnit templateUnit = aTemplate->unit(i);
|
PTemplateUnit templateUnit = aTemplate->unit(i);
|
||||||
QString s;
|
QString s;
|
||||||
PProjectUnit unit;
|
PProjectUnit unit;
|
||||||
if (aTemplate->options().useGPP) {
|
if (options().useGPP) {
|
||||||
s = templateUnit->CppText;
|
s = templateUnit->CppText;
|
||||||
unit = newUnit(mNode, templateUnit->CppName);
|
unit = newUnit(mNode, templateUnit->CppName);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -164,7 +164,7 @@ public:
|
||||||
void setCompilerSet(int compilerSetIndex);
|
void setCompilerSet(int compilerSetIndex);
|
||||||
|
|
||||||
//void showOptions();
|
//void showOptions();
|
||||||
bool assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate);
|
bool assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, bool useCpp);
|
||||||
//void saveToLog();
|
//void saveToLog();
|
||||||
|
|
||||||
std::shared_ptr<CppParser> cppParser();
|
std::shared_ptr<CppParser> cppParser();
|
||||||
|
|
|
@ -947,14 +947,14 @@ void CodeCompletionPopup::getCompletionFor(const QStringList &expression, const
|
||||||
scopeName,
|
scopeName,
|
||||||
mCurrentStatement,
|
mCurrentStatement,
|
||||||
parentTypeStatement);
|
parentTypeStatement);
|
||||||
qDebug()<<scopeName;
|
// qDebug()<<scopeName;
|
||||||
qDebug()<<memberOperator;
|
// qDebug()<<memberOperator;
|
||||||
qDebug()<<memberExpression;
|
// qDebug()<<memberExpression;
|
||||||
if(!ownerStatement ) {
|
if(!ownerStatement ) {
|
||||||
qDebug()<<"not found!";
|
// qDebug()<<"not found!";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qDebug()<<"found: "<<ownerStatement->fullName;
|
// qDebug()<<"found: "<<ownerStatement->fullName;
|
||||||
if (memberOperator == "::") {
|
if (memberOperator == "::") {
|
||||||
if (ownerStatement->kind==StatementKind::skNamespace) {
|
if (ownerStatement->kind==StatementKind::skNamespace) {
|
||||||
//there might be many statements corresponding to one namespace;
|
//there might be many statements corresponding to one namespace;
|
||||||
|
|
|
@ -81,9 +81,9 @@ bool NewProjectDialog::isCppProject()
|
||||||
return ui->rdCppProject->isChecked();
|
return ui->rdCppProject->isChecked();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NewProjectDialog::makeProjectDefault()
|
bool NewProjectDialog::makeDefaultLanguage()
|
||||||
{
|
{
|
||||||
return ui->chkMakeDefault->isChecked();
|
return ui->chkMakeDefaultLanguage->isChecked();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NewProjectDialog::addTemplate(const QString &filename)
|
void NewProjectDialog::addTemplate(const QString &filename)
|
||||||
|
@ -187,15 +187,21 @@ void NewProjectDialog::on_lstTemplates_currentItemChanged(QListWidgetItem *curre
|
||||||
PProjectTemplate t = mTemplates[index];
|
PProjectTemplate t = mTemplates[index];
|
||||||
ui->lblDescription->setText(t->description());
|
ui->lblDescription->setText(t->description());
|
||||||
if (t->options().useGPP) {
|
if (t->options().useGPP) {
|
||||||
|
ui->rdCProject->setEnabled(false);
|
||||||
ui->rdCppProject->setChecked(true);
|
ui->rdCppProject->setChecked(true);
|
||||||
} else {
|
} else {
|
||||||
ui->rdCProject->setChecked(true);
|
ui->rdCProject->setEnabled(true);
|
||||||
|
if (pSettings->editor().defaultFileCpp()) {
|
||||||
|
ui->rdCppProject->setChecked(true);
|
||||||
|
} else {
|
||||||
|
ui->rdCProject->setChecked(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ui->lblDescription->setText("");
|
ui->lblDescription->setText("");
|
||||||
ui->rdCProject->setChecked(false);
|
ui->rdCProject->setChecked(false);
|
||||||
ui->rdCppProject->setChecked(false);
|
ui->rdCppProject->setChecked(false);
|
||||||
ui->chkMakeDefault->setChecked(false);
|
ui->chkMakeDefaultLanguage->setChecked(false);
|
||||||
}
|
}
|
||||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
|
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
|
||||||
current && !ui->txtProjectName->text().isEmpty()
|
current && !ui->txtProjectName->text().isEmpty()
|
||||||
|
|
|
@ -23,7 +23,7 @@ public:
|
||||||
bool useAsDefaultProjectDir();
|
bool useAsDefaultProjectDir();
|
||||||
bool isCProject();
|
bool isCProject();
|
||||||
bool isCppProject();
|
bool isCppProject();
|
||||||
bool makeProjectDefault();
|
bool makeDefaultLanguage();
|
||||||
private slots:
|
private slots:
|
||||||
void updateView();
|
void updateView();
|
||||||
void updateProjectLocation();
|
void updateProjectLocation();
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
<number>10</number>
|
<number>10</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QCheckBox" name="chkMakeDefault">
|
<widget class="QCheckBox" name="chkMakeDefaultLanguage">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Make default language</string>
|
<string>Make default language</string>
|
||||||
</property>
|
</property>
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Windows Application
|
||||||
|
Icon=Windows.ico
|
||||||
|
Description=A standard Windows application
|
||||||
|
Category=Basic
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=winapp_c.txt
|
||||||
|
Cpp=winapp_c.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=0
|
|
@ -0,0 +1,16 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Console Application
|
||||||
|
Icon=ConsoleToo.ico
|
||||||
|
Description=A console application (MS-DOS window)
|
||||||
|
Category=Basic
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=consoleapp_c.txt
|
||||||
|
Cpp=consoleapp_cpp.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=1
|
|
@ -0,0 +1,14 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Static Library
|
||||||
|
Icon=StaticLib.ico
|
||||||
|
Description=A static library (.a)
|
||||||
|
Category=Basic
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=
|
||||||
|
CppName=
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=2
|
|
@ -0,0 +1,25 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=DLL
|
||||||
|
Icon=DLL.ico
|
||||||
|
Description=A Dynamic Link Library (DLL)
|
||||||
|
Category=Basic
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=dllmain.c
|
||||||
|
CppName=dllmain.cpp
|
||||||
|
C=DLL_c.txt
|
||||||
|
Cpp=Dll_cpp.txt
|
||||||
|
|
||||||
|
[Unit1]
|
||||||
|
CName=dll.h
|
||||||
|
CppName=dll.h
|
||||||
|
C=DLL_h.txt
|
||||||
|
Cpp=Dll_hpp.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=2
|
||||||
|
Type=3
|
||||||
|
|
||||||
|
Compiler=-DBUILDING_DLL=1
|
||||||
|
CppCompiler=-DBUILDING_DLL=1
|
|
@ -0,0 +1,14 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Empty Project
|
||||||
|
Icon=Empty.ico
|
||||||
|
Description=An empty project
|
||||||
|
Category=Basic
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=
|
||||||
|
CppName=
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=1
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,17 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=GLUT
|
||||||
|
Icon=CL_GLUT.ico
|
||||||
|
Description=A simple GLUT program
|
||||||
|
Category=Multimedia
|
||||||
|
[Unit0]
|
||||||
|
CppName=main.cpp
|
||||||
|
C=CL_GLUT_cpp.txt
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=0
|
||||||
|
IsCpp=1
|
||||||
|
linker=-lm -lfreeglut_static -lopengl32 -lwinmm -lgdi32_@@__@@_
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
#define FREEGLUT_STATIC
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <GL/glut.h>
|
||||||
|
|
||||||
|
void keyboard(unsigned char key, int x, int y);
|
||||||
|
void display(void);
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
glutInit(&argc, argv);
|
||||||
|
glutCreateWindow("GLUT Test");
|
||||||
|
glutKeyboardFunc(&keyboard);
|
||||||
|
glutDisplayFunc(&display);
|
||||||
|
glutMainLoop();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void keyboard(unsigned char key, int x, int y)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case '\x1B':
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void display()
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glColor3f(1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
glBegin(GL_POLYGON);
|
||||||
|
glVertex2f(-0.5f, -0.5f);
|
||||||
|
glVertex2f( 0.5f, -0.5f);
|
||||||
|
glVertex2f( 0.5f, 0.5f);
|
||||||
|
glVertex2f(-0.5f, 0.5f);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glFlush();
|
||||||
|
}
|
After Width: | Height: | Size: 4.1 KiB |
|
@ -0,0 +1,16 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Graphics.h
|
||||||
|
Icon=CL_Graphics.ico
|
||||||
|
Description=A simple program use Easy Graphics Engine
|
||||||
|
Category=Multimedia
|
||||||
|
[Unit0]
|
||||||
|
CppName=main.cpp
|
||||||
|
Cpp=CL_Graphics_cpp.txt
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=0
|
||||||
|
IsCpp=1
|
||||||
|
linker=-lgraphics -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lgdiplus_@@__@@_
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#include <graphics.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
void paintstar(double x, double y, double r, double a)
|
||||||
|
{
|
||||||
|
int pt[10];
|
||||||
|
for (int n = 0; n < 5; ++n)
|
||||||
|
{
|
||||||
|
pt[n*2] = (int)( -cos( PI * 4 / 5 * n + a ) * r + x );
|
||||||
|
pt[n*2+1] = (int)( sin( PI * 4 / 5 * n + a) * r + y );
|
||||||
|
}
|
||||||
|
fillpoly(5, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
initgraph( 640, 480 );
|
||||||
|
setcolor( RGB(0xff, 0xff, 0xff) );
|
||||||
|
setfillcolor( RGB(0, 0, 0xff) );
|
||||||
|
setrendermode(RENDER_MANUAL);
|
||||||
|
|
||||||
|
double r = 0;
|
||||||
|
for ( ; is_run(); delay_fps(60) )
|
||||||
|
{
|
||||||
|
r += 0.02;
|
||||||
|
if (r > PI * 2) r -= PI * 2;
|
||||||
|
|
||||||
|
cleardevice();
|
||||||
|
paintstar(300, 200, 100, r);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,15 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Turtle Graphics
|
||||||
|
Icon=CL_Turtle.ico
|
||||||
|
Description=A simple program using Turtle Graphics (https://github.com/royqh1979/libturtle)
|
||||||
|
Category=Multimedia
|
||||||
|
[Unit0]
|
||||||
|
CppName=main.cpp
|
||||||
|
Cpp=CL_Turtle_cpp.txt
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=0
|
||||||
|
IsCpp=1
|
||||||
|
linker=-lturtle -lgraphics -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lgdiplus_@@__@@_
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#include <turtle.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int n;
|
||||||
|
initWorld(800,600);
|
||||||
|
setSpeed(1000);
|
||||||
|
//setImmediate(1);
|
||||||
|
|
||||||
|
n=50;
|
||||||
|
for (int i=0;i<n;i++) {
|
||||||
|
for (int j=0;j<4;j++) {
|
||||||
|
fd(90);
|
||||||
|
lt(90);
|
||||||
|
}
|
||||||
|
lt(360.0/n);
|
||||||
|
}
|
||||||
|
pause();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -0,0 +1,8 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
return 0;
|
||||||
|
}
|
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,34 @@
|
||||||
|
/* Replace "dll.h" with the name of your header */
|
||||||
|
#include "dll.h"
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
DLLIMPORT void HelloWorld()
|
||||||
|
{
|
||||||
|
MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
|
||||||
|
{
|
||||||
|
switch(fdwReason)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return TRUE on success, FALSE on failure */
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/* Replace "dll.h" with the name of your header */
|
||||||
|
#include "dll.h"
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
DllClass::DllClass()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
DllClass::~DllClass()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DllClass::HelloWorld()
|
||||||
|
{
|
||||||
|
MessageBox(0, "Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
|
||||||
|
{
|
||||||
|
switch(fdwReason)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return TRUE on success, FALSE on failure */
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef _DLL_H_
|
||||||
|
#define _DLL_H_
|
||||||
|
|
||||||
|
#if BUILDING_DLL
|
||||||
|
#define DLLIMPORT __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define DLLIMPORT __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DLLIMPORT void HelloWorld();
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef _DLL_H_
|
||||||
|
#define _DLL_H_
|
||||||
|
|
||||||
|
#if BUILDING_DLL
|
||||||
|
#define DLLIMPORT __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define DLLIMPORT __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class DLLIMPORT DllClass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DllClass();
|
||||||
|
virtual ~DllClass();
|
||||||
|
void HelloWorld();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 766 B |
|
@ -0,0 +1,29 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=File Editor
|
||||||
|
Icon=Editor.ico
|
||||||
|
Description=A simple Win32 file editor
|
||||||
|
Category=Win32
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=FileEditor_c.txt
|
||||||
|
Cpp=FileEditor_c.txt
|
||||||
|
|
||||||
|
[Unit1]
|
||||||
|
CName=main.h
|
||||||
|
CppName=main.h
|
||||||
|
C=FileEditor_h.txt
|
||||||
|
Cpp=FileEditor_h.txt
|
||||||
|
|
||||||
|
[Unit2]
|
||||||
|
CName=resource.rc
|
||||||
|
CppName=resource.rc
|
||||||
|
C=FileEditor_rc.txt
|
||||||
|
Cpp=FileEditor_rc.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=3
|
||||||
|
Type=0
|
||||||
|
Icon=Editor.ico
|
|
@ -0,0 +1,172 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
BOOL LoadFile(HWND hEdit, LPSTR pszFileName) {
|
||||||
|
HANDLE hFile;
|
||||||
|
BOOL bSuccess = FALSE;
|
||||||
|
|
||||||
|
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
|
||||||
|
if(hFile != INVALID_HANDLE_VALUE) {
|
||||||
|
DWORD dwFileSize;
|
||||||
|
dwFileSize = GetFileSize(hFile, NULL);
|
||||||
|
if(dwFileSize != 0xFFFFFFFF) {
|
||||||
|
LPSTR pszFileText;
|
||||||
|
pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
|
||||||
|
if(pszFileText != NULL) {
|
||||||
|
DWORD dwRead;
|
||||||
|
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL)) {
|
||||||
|
pszFileText[dwFileSize] = 0; // Null terminator
|
||||||
|
if(SetWindowText(hEdit, pszFileText))
|
||||||
|
bSuccess = TRUE; // It worked!
|
||||||
|
}
|
||||||
|
GlobalFree(pszFileText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hFile);
|
||||||
|
}
|
||||||
|
return bSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL SaveFile(HWND hEdit, LPSTR pszFileName) {
|
||||||
|
HANDLE hFile;
|
||||||
|
BOOL bSuccess = FALSE;
|
||||||
|
|
||||||
|
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
if(hFile != INVALID_HANDLE_VALUE) {
|
||||||
|
DWORD dwTextLength;
|
||||||
|
dwTextLength = GetWindowTextLength(hEdit);
|
||||||
|
if(dwTextLength > 0) {
|
||||||
|
LPSTR pszText;
|
||||||
|
pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
|
||||||
|
if(pszText != NULL) {
|
||||||
|
if(GetWindowText(hEdit, pszText, dwTextLength + 1)) {
|
||||||
|
DWORD dwWritten;
|
||||||
|
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
|
||||||
|
bSuccess = TRUE;
|
||||||
|
}
|
||||||
|
GlobalFree(pszText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hFile);
|
||||||
|
}
|
||||||
|
return bSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL DoFileOpenSave(HWND hwnd, BOOL bSave) {
|
||||||
|
OPENFILENAME ofn;
|
||||||
|
char szFileName[MAX_PATH];
|
||||||
|
|
||||||
|
ZeroMemory(&ofn, sizeof(ofn));
|
||||||
|
szFileName[0] = 0;
|
||||||
|
|
||||||
|
ofn.lStructSize = sizeof(ofn);
|
||||||
|
ofn.hwndOwner = hwnd;
|
||||||
|
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
|
||||||
|
ofn.lpstrFile = szFileName;
|
||||||
|
ofn.nMaxFile = MAX_PATH;
|
||||||
|
ofn.lpstrDefExt = "txt";
|
||||||
|
|
||||||
|
if(bSave) {
|
||||||
|
ofn.Flags = OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
|
||||||
|
if(GetSaveFileName(&ofn)) {
|
||||||
|
if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) {
|
||||||
|
MessageBox(hwnd, "Save file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ofn.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
|
||||||
|
if(GetOpenFileName(&ofn)) {
|
||||||
|
if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) {
|
||||||
|
MessageBox(hwnd, "Load of file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
|
||||||
|
switch(Message) {
|
||||||
|
case WM_CREATE:
|
||||||
|
CreateWindow("EDIT", "",WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE|ES_WANTRETURN,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,hwnd, (HMENU)IDC_MAIN_TEXT, GetModuleHandle(NULL), NULL);
|
||||||
|
SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE,0));
|
||||||
|
break;
|
||||||
|
case WM_SIZE:
|
||||||
|
if(wParam != SIZE_MINIMIZED)
|
||||||
|
MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),HIWORD(lParam), TRUE);
|
||||||
|
break;
|
||||||
|
case WM_SETFOCUS:
|
||||||
|
SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
|
||||||
|
break;
|
||||||
|
case WM_COMMAND:
|
||||||
|
switch(LOWORD(wParam)) {
|
||||||
|
case CM_FILE_OPEN:
|
||||||
|
DoFileOpenSave(hwnd, FALSE);
|
||||||
|
break;
|
||||||
|
case CM_FILE_SAVEAS:
|
||||||
|
DoFileOpenSave(hwnd, TRUE);
|
||||||
|
break;
|
||||||
|
case CM_FILE_EXIT:
|
||||||
|
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
||||||
|
break;
|
||||||
|
case CM_ABOUT:
|
||||||
|
MessageBox (NULL, "File Editor for Windows!\nCreated using the Win32 API" , "About...", 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_CLOSE:
|
||||||
|
DestroyWindow(hwnd);
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return DefWindowProc(hwnd, Message, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) {
|
||||||
|
WNDCLASSEX wc;
|
||||||
|
HWND hwnd;
|
||||||
|
MSG Msg;
|
||||||
|
|
||||||
|
wc.cbSize = sizeof(WNDCLASSEX);
|
||||||
|
wc.style = 0;
|
||||||
|
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)(COLOR_WINDOW+1);
|
||||||
|
wc.lpszMenuName = "MAINMENU";
|
||||||
|
wc.lpszClassName = "WindowClass";
|
||||||
|
wc.hIconSm = LoadIcon(hInstance,"A"); /* A is name used by project icons */
|
||||||
|
|
||||||
|
if(!RegisterClassEx(&wc)) {
|
||||||
|
MessageBox(0,"Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","File Editor Example Program",WS_OVERLAPPEDWINDOW,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
320,240,
|
||||||
|
NULL, NULL, hInstance, NULL);
|
||||||
|
|
||||||
|
if(hwnd == NULL) {
|
||||||
|
MessageBox(0, "Window Creation Failed!", "Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowWindow(hwnd,1);
|
||||||
|
UpdateWindow(hwnd);
|
||||||
|
|
||||||
|
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
|
||||||
|
TranslateMessage(&Msg);
|
||||||
|
DispatchMessage(&Msg);
|
||||||
|
}
|
||||||
|
return Msg.wParam;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#define CM_FILE_SAVEAS 9072
|
||||||
|
#define CM_FILE_EXIT 9071
|
||||||
|
#define CM_FILE_OPEN 9070
|
||||||
|
#define CM_ABOUT 9069
|
||||||
|
|
||||||
|
#define IDC_MAIN_TEXT 1001
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
MAINMENU MENU
|
||||||
|
{
|
||||||
|
POPUP "&File"
|
||||||
|
{
|
||||||
|
MENUITEM "&Open...", CM_FILE_OPEN
|
||||||
|
MENUITEM "Save &As...", CM_FILE_SAVEAS
|
||||||
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "E&xit", CM_FILE_EXIT
|
||||||
|
}
|
||||||
|
|
||||||
|
POPUP "&Help"
|
||||||
|
{
|
||||||
|
MENUITEM "&About", CM_ABOUT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,32 @@
|
||||||
|
[Template]
|
||||||
|
ver=2
|
||||||
|
Name=GLFW
|
||||||
|
Description=A simple GLFW program
|
||||||
|
Icon=GLFW.ico
|
||||||
|
Category=Multimedia
|
||||||
|
[Unit0]
|
||||||
|
CppName=main.cpp
|
||||||
|
Cpp=GLFW_main.cpp.txt
|
||||||
|
[Unit1]
|
||||||
|
CppName=shader.h
|
||||||
|
Cpp=GLFW_shader.h.txt
|
||||||
|
[Unit2]
|
||||||
|
CppName=shader.frag
|
||||||
|
Cpp=GLFW_shader.frag.txt
|
||||||
|
[Unit3]
|
||||||
|
CppName=shader.vs
|
||||||
|
Cpp=GLFW_shader.vs.txt
|
||||||
|
[Project]
|
||||||
|
UnitCount=4
|
||||||
|
Type=1
|
||||||
|
IsCpp=1
|
||||||
|
Compiler=
|
||||||
|
CppCompiler=
|
||||||
|
Linker=-lglfw3 -lglew32 -lopengl32 -lwinmm -lgdi32_@@__@@_
|
||||||
|
CompilerSettings=0000000000110000000001000
|
||||||
|
CompilerSet=1
|
||||||
|
UseUTF8=0
|
||||||
|
StaticLink=1
|
||||||
|
AddCharset=1
|
||||||
|
IncludeVersionInfo=0
|
||||||
|
SupportXPThemes=0
|
|
@ -0,0 +1,111 @@
|
||||||
|
#include <iostream>
|
||||||
|
// GLEW
|
||||||
|
#define GLEW_STATIC
|
||||||
|
#include <GL/glew.h>
|
||||||
|
// GLFW
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
// Other includes
|
||||||
|
#include "shader.h"
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
|
||||||
|
|
||||||
|
// Window dimensions
|
||||||
|
const GLuint WIDTH = 800, HEIGHT = 600;
|
||||||
|
|
||||||
|
// The MAIN function, from here we start the application and run the game loop
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// Init GLFW
|
||||||
|
glfwInit();
|
||||||
|
// Set all the required options for GLFW
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||||
|
|
||||||
|
// Create a GLFWwindow object that we can use for GLFW's functions
|
||||||
|
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
|
||||||
|
glfwMakeContextCurrent(window);
|
||||||
|
|
||||||
|
// Set the required callback functions
|
||||||
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
|
// Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
|
||||||
|
glewExperimental = GL_TRUE;
|
||||||
|
// Initialize GLEW to setup the OpenGL Function pointers
|
||||||
|
glewInit();
|
||||||
|
|
||||||
|
// Define the viewport dimensions
|
||||||
|
glViewport(0, 0, WIDTH, HEIGHT);
|
||||||
|
|
||||||
|
|
||||||
|
//读取shader文件,并编译,见shader.h代码
|
||||||
|
Shader ourShader("shader.vs", "shader.frag");
|
||||||
|
|
||||||
|
|
||||||
|
// 一维数组,每六个代表一个顶点属性,前三个代表位置属性,后三个代表颜色属性
|
||||||
|
GLfloat vertices[] = {
|
||||||
|
// Positions // Colors
|
||||||
|
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // Bottom Right
|
||||||
|
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // Bottom Left
|
||||||
|
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // Top
|
||||||
|
};
|
||||||
|
GLuint VBO, VAO;//声明顶点缓冲,声明顶点数组用于管理顶点数据
|
||||||
|
glGenVertexArrays(1, &VAO);//创建顶点数组,返回一个独一无二的整数,标识数组
|
||||||
|
glGenBuffers(1, &VBO);//创建顶点缓冲,返回一个独一无二的整数,标识缓冲区
|
||||||
|
|
||||||
|
glBindVertexArray(VAO);//绑定顶点数组
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, VBO);//绑定顶点缓冲
|
||||||
|
//指定顶点数组的数据源为vertices,第四个参数代表显卡如何管理给定的数据,GL_STATIC_DRWA代表几乎不会改变
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// 指定顶点属性的解析方式。即,如何从顶点缓冲获取相应的顶点属性和相应的颜色属性。或者说,顶点着色器中如何知道去哪个顶点属性分量重着色呢
|
||||||
|
//对每一个顶点而言,属性有2种,一是位置属性,而是颜色属性,因此每六个浮点数决定了一个顶点的位置和颜色
|
||||||
|
|
||||||
|
//顶点着色器中使用layout(location = 0)定义了position顶点属性的位置值(Location),因此第一个参数,代表属性分量的索引
|
||||||
|
//参数二:顶点位置属性的维度,参数三:属性向量的数据类型,参数四:是否标准化;参数五,顶点位置属性的总字节长度,参数六:在缓冲数组中的偏移量,即起始位置
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
|
||||||
|
glEnableVertexAttribArray(0);//启用属性0,因为默认是禁用的
|
||||||
|
|
||||||
|
// 参数一,对应顶点着色器中的layout (location = 1) in vec3 color;参数六:说明颜色属性的偏移量在三个浮点数后,与上文vertices一致
|
||||||
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
|
||||||
|
glEnableVertexAttribArray(1);//启用属性1.
|
||||||
|
|
||||||
|
//顶点数组对象(Vertex Array Object, VAO)的好处就是,当配置顶点属性指针时,你只需要将上面的代码调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。如下文循环中的绑定再解绑
|
||||||
|
glBindVertexArray(0); // 解绑 VAO
|
||||||
|
// Game loop
|
||||||
|
while (!glfwWindowShouldClose(window))
|
||||||
|
{
|
||||||
|
// 检查事件,调用相应的回调函数,如下文的key_callback函数
|
||||||
|
glfwPollEvents();
|
||||||
|
|
||||||
|
// Render
|
||||||
|
// Clear the colorbuffer
|
||||||
|
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//渲染颜色到后台缓冲
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);//清除前台缓冲
|
||||||
|
|
||||||
|
// Draw the triangle
|
||||||
|
ourShader.Use();//启用着色器程序
|
||||||
|
glBindVertexArray(VAO);//每次循环都调用,绑定函数绑定VAO
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
glBindVertexArray(0);//解绑
|
||||||
|
|
||||||
|
// Swap the screen buffers
|
||||||
|
glfwSwapBuffers(window);
|
||||||
|
}
|
||||||
|
// Properly de-allocate all resources once they've outlived their purpose
|
||||||
|
glDeleteVertexArrays(1, &VAO);
|
||||||
|
glDeleteBuffers(1, &VBO);
|
||||||
|
// Terminate GLFW, clearing any resources allocated by GLFW.
|
||||||
|
glfwTerminate();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Is called whenever a key is pressed/released via GLFW
|
||||||
|
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
|
||||||
|
{
|
||||||
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
|
glfwSetWindowShouldClose(window, GL_TRUE);
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
#version 330 core
|
||||||
|
in vec3 ourColor;
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
color = vec4(ourColor, 1.0f);
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
#ifndef SHADER_H
|
||||||
|
#define SHADER_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <GL/glew.h>
|
||||||
|
|
||||||
|
class Shader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GLuint Program;
|
||||||
|
// Constructor generates the shader on the fly
|
||||||
|
Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
|
||||||
|
{
|
||||||
|
// 1. Retrieve the vertex/fragment source code from filePath
|
||||||
|
std::string vertexCode;
|
||||||
|
std::string fragmentCode;
|
||||||
|
std::ifstream vShaderFile;
|
||||||
|
std::ifstream fShaderFile;
|
||||||
|
// ensures ifstream objects can throw exceptions:
|
||||||
|
vShaderFile.exceptions(std::ifstream::badbit);
|
||||||
|
fShaderFile.exceptions(std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Open files
|
||||||
|
vShaderFile.open(vertexPath);
|
||||||
|
fShaderFile.open(fragmentPath);
|
||||||
|
std::stringstream vShaderStream, fShaderStream;
|
||||||
|
// Read file's buffer contents into streams
|
||||||
|
vShaderStream << vShaderFile.rdbuf();
|
||||||
|
fShaderStream << fShaderFile.rdbuf();
|
||||||
|
// close file handlers
|
||||||
|
vShaderFile.close();
|
||||||
|
fShaderFile.close();
|
||||||
|
// Convert stream into string
|
||||||
|
vertexCode = vShaderStream.str();
|
||||||
|
fragmentCode = fShaderStream.str();
|
||||||
|
}
|
||||||
|
catch (std::ifstream::failure e)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
|
||||||
|
}
|
||||||
|
const GLchar* vShaderCode = vertexCode.c_str();
|
||||||
|
const GLchar * fShaderCode = fragmentCode.c_str();
|
||||||
|
// 2. Compile shaders
|
||||||
|
GLuint vertex, fragment;
|
||||||
|
GLint success;
|
||||||
|
GLchar infoLog[512];
|
||||||
|
// Vertex Shader
|
||||||
|
vertex = glCreateShader(GL_VERTEX_SHADER);//创建顶点着色器
|
||||||
|
glShaderSource(vertex, 1, &vShaderCode, NULL);//指定源代码
|
||||||
|
glCompileShader(vertex);//编译着色器
|
||||||
|
// Print compile errors if any
|
||||||
|
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);//查看是否编译成功
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
glGetShaderInfoLog(vertex, 512, NULL, infoLog);
|
||||||
|
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
|
||||||
|
}
|
||||||
|
// Fragment Shader
|
||||||
|
fragment = glCreateShader(GL_FRAGMENT_SHADER);//创建片段着色器
|
||||||
|
glShaderSource(fragment, 1, &fShaderCode, NULL);
|
||||||
|
glCompileShader(fragment);
|
||||||
|
// Print compile errors if any
|
||||||
|
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
glGetShaderInfoLog(fragment, 512, NULL, infoLog);
|
||||||
|
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
|
||||||
|
}
|
||||||
|
// Shader Program
|
||||||
|
this->Program = glCreateProgram();//创建着色程序
|
||||||
|
glAttachShader(this->Program, vertex);//关联顶点着色器
|
||||||
|
glAttachShader(this->Program, fragment);//关联片段着色器
|
||||||
|
glLinkProgram(this->Program);//链接编译器
|
||||||
|
// Print linking errors if any
|
||||||
|
glGetProgramiv(this->Program, GL_LINK_STATUS, &success);
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
glGetProgramInfoLog(this->Program, 512, NULL, infoLog);
|
||||||
|
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
|
||||||
|
}
|
||||||
|
// Delete the shaders as they're linked into our program now and no longer necessery
|
||||||
|
glDeleteShader(vertex);
|
||||||
|
glDeleteShader(fragment);
|
||||||
|
|
||||||
|
}
|
||||||
|
// Uses the current shader
|
||||||
|
void Use()
|
||||||
|
{
|
||||||
|
glUseProgram(this->Program);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,11 @@
|
||||||
|
#version 330 core
|
||||||
|
layout (location = 0) in vec3 position;//in 代表输入向量, location,与下面的顶点属性描述有关。
|
||||||
|
layout (location = 1) in vec3 color;
|
||||||
|
|
||||||
|
out vec3 ourColor;//out 代表输出3维向量,作为片段着色器的输入,见下文
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = vec4(position, 1.0f);
|
||||||
|
ourColor = color;
|
||||||
|
}
|
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,17 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Hello World
|
||||||
|
Icon=Communication.ico
|
||||||
|
Description=A classic Hello World program
|
||||||
|
Category=Console
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=Hello_c.txt
|
||||||
|
Cpp=Hello_cpp.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=1
|
||||||
|
Icon=Communication.ico
|
|
@ -0,0 +1,16 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Input Loop
|
||||||
|
Icon=ConsoleToo.ico
|
||||||
|
Description=A console with an input loop
|
||||||
|
Category=Console
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.c
|
||||||
|
C=HelloInput_c.txt
|
||||||
|
Cpp=HelloInput_cpp.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=1
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void Foo() {
|
||||||
|
printf("Hello World!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
char input = 0;
|
||||||
|
|
||||||
|
printf("Hello! This is a console application.\n");
|
||||||
|
printf("Press q to quit, press a to execute foo.\n");
|
||||||
|
while(1) {
|
||||||
|
if(scanf("%c",&input) == 1) {
|
||||||
|
if(input == 'a') {
|
||||||
|
Foo();
|
||||||
|
} else if(input == 'q') {
|
||||||
|
break;
|
||||||
|
} else if(input != '\n') {
|
||||||
|
printf("Unknown command '%c'! Ignoring...\n",input);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("Invalid input! Ignoring...\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <iostream>
|
||||||
|
using std::cin;
|
||||||
|
using std::cout;
|
||||||
|
using std::endl;
|
||||||
|
|
||||||
|
void Foo() {
|
||||||
|
cout << "Hello World!" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
char input = 0;
|
||||||
|
|
||||||
|
cout << "Hello! This is a console application." << endl;
|
||||||
|
cout << "Press q to quit, press a to execute foo." << endl;
|
||||||
|
while(1) {
|
||||||
|
cin >> input;
|
||||||
|
if(input == 'a') {
|
||||||
|
Foo();
|
||||||
|
} else if(input == 'q') {
|
||||||
|
break;
|
||||||
|
} else if(input != '\n') {
|
||||||
|
cout << "Unknown command '" << input << "'! Ignoring...\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
printf("Hello world!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
std::cout << "Hello world!\n";
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Jackpot
|
||||||
|
Icon=Games.ico
|
||||||
|
Description=A number guessing game
|
||||||
|
Category=Console
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=Jackpot_c.txt
|
||||||
|
Cpp=Jackpot_cpp.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=1
|
||||||
|
Icon=Games.ico
|
|
@ -0,0 +1,88 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void Start();
|
||||||
|
void GetResults();
|
||||||
|
|
||||||
|
int i, j, life, maxrand;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
void Start() {
|
||||||
|
i = 0;
|
||||||
|
j = 0;
|
||||||
|
life = 0;
|
||||||
|
maxrand = 6;
|
||||||
|
|
||||||
|
cout << "Select difficulty mode:\n"; // the user has to select a difficutly level
|
||||||
|
cout << "1 : Easy (0-15)\n";
|
||||||
|
cout << "2 : Medium (0-30)\n";
|
||||||
|
cout << "3 : Difficult (0-50)\n";
|
||||||
|
cout << "or type another key to quit\n";
|
||||||
|
c = 30;
|
||||||
|
|
||||||
|
cin >> c; // read the user's choice
|
||||||
|
cout << "\n";
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case '1':
|
||||||
|
maxrand = 15; // the random number will be between 0 and maxrand
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
maxrand = 30;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
maxrand = 50;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
life = 5; // number of lifes of the player
|
||||||
|
srand((unsigned)time(NULL)); // init Rand() function
|
||||||
|
j = rand() % maxrand; // j get a random value between 0 and maxrand
|
||||||
|
|
||||||
|
GetResults();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetResults() {
|
||||||
|
if (life <= 0) { // if player has no more life then he loses
|
||||||
|
cout << "You lose !\n\n";
|
||||||
|
Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "Type a number: \n";
|
||||||
|
cin >> i;
|
||||||
|
|
||||||
|
if((i>maxrand) || (i<0)) { // if the user number isn't correct, restart
|
||||||
|
cout << "Error: number not between 0 and \n" << maxrand;
|
||||||
|
GetResults();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(i == j) {
|
||||||
|
cout << "YOU WIN!\n\n"; // the user found the secret number
|
||||||
|
Start();
|
||||||
|
} else if(i>j) {
|
||||||
|
cout << "Too BIG\n";
|
||||||
|
life = life - 1;
|
||||||
|
cout << "Lives remaining: " << life << "\n\n";
|
||||||
|
GetResults();
|
||||||
|
} else if(i<j) {
|
||||||
|
cout << "Too SMALL\n";
|
||||||
|
life = life - 1;
|
||||||
|
cout << "Lives remaining: " << life << "\n\n";
|
||||||
|
GetResults();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
cout << "** Jackpot game **\n";
|
||||||
|
cout << "The goal of this game is to guess a number.\n";
|
||||||
|
cout << "Jackpot will tell you if the number is too big or too\n";
|
||||||
|
cout << "small compared to the secret number to find.\n\n";
|
||||||
|
Start();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=MDI Editor
|
||||||
|
Icon=Windows.ico
|
||||||
|
Description=A Win32 MDI file editor
|
||||||
|
Category=Win32
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=MDIEditor_c.txt
|
||||||
|
Cpp=MDIEditor_c.txt
|
||||||
|
|
||||||
|
[Unit1]
|
||||||
|
CName=main.h
|
||||||
|
CppName=main.h
|
||||||
|
C=MDIEditor_h.txt
|
||||||
|
Cpp=MDIEditor_h.txt
|
||||||
|
|
||||||
|
[Unit2]
|
||||||
|
CName=resource.rc
|
||||||
|
CppName=resource.rc
|
||||||
|
C=MDIEditor_rc.txt
|
||||||
|
Cpp=MDIEditor_rc.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=3
|
||||||
|
Type=0
|
|
@ -0,0 +1,433 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include <commctrl.h>
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam,LPARAM lParam);
|
||||||
|
|
||||||
|
char g_szAppName[] = "MyMDIWindow";
|
||||||
|
char g_szChild[] = "MyMDIChild";
|
||||||
|
HINSTANCE g_hInst;
|
||||||
|
HWND g_hMDIClient, g_hStatusBar, g_hToolBar;
|
||||||
|
HWND g_hMainWindow;
|
||||||
|
|
||||||
|
BOOL LoadFile(HWND hEdit, LPSTR pszFileName) {
|
||||||
|
HANDLE hFile;
|
||||||
|
BOOL bSuccess = FALSE;
|
||||||
|
|
||||||
|
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||||
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
if(hFile != INVALID_HANDLE_VALUE) {
|
||||||
|
DWORD dwFileSize;
|
||||||
|
dwFileSize = GetFileSize(hFile, NULL);
|
||||||
|
if(dwFileSize != 0xFFFFFFFF) {
|
||||||
|
LPSTR pszFileText;
|
||||||
|
pszFileText = (LPSTR)(GlobalAlloc(GPTR, dwFileSize + 1));
|
||||||
|
if(pszFileText != NULL) {
|
||||||
|
DWORD dwRead;
|
||||||
|
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL)) {
|
||||||
|
pszFileText[dwFileSize] = 0; // Null terminator
|
||||||
|
if(SetWindowText(hEdit, pszFileText))
|
||||||
|
bSuccess = TRUE; // It worked!
|
||||||
|
}
|
||||||
|
GlobalFree(pszFileText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hFile);
|
||||||
|
}
|
||||||
|
return bSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL SaveFile(HWND hEdit, LPSTR pszFileName) {
|
||||||
|
HANDLE hFile;
|
||||||
|
BOOL bSuccess = FALSE;
|
||||||
|
|
||||||
|
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, NULL,
|
||||||
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
if(hFile != INVALID_HANDLE_VALUE) {
|
||||||
|
DWORD dwTextLength;
|
||||||
|
dwTextLength = GetWindowTextLength(hEdit);
|
||||||
|
if(dwTextLength > 0) {// No need to bother if there's no text.
|
||||||
|
LPSTR pszText;
|
||||||
|
pszText = (LPSTR)(GlobalAlloc(GPTR, dwTextLength + 1));
|
||||||
|
if(pszText != NULL) {
|
||||||
|
if(GetWindowText(hEdit, pszText, dwTextLength + 1)) {
|
||||||
|
DWORD dwWritten;
|
||||||
|
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
|
||||||
|
bSuccess = TRUE;
|
||||||
|
}
|
||||||
|
GlobalFree(pszText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hFile);
|
||||||
|
}
|
||||||
|
return bSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL GetFileName(HWND hwnd, LPSTR pszFileName, BOOL bSave) {
|
||||||
|
OPENFILENAME ofn;
|
||||||
|
|
||||||
|
ZeroMemory(&ofn, sizeof(ofn));
|
||||||
|
pszFileName[0] = 0;
|
||||||
|
|
||||||
|
ofn.lStructSize = sizeof(ofn);
|
||||||
|
ofn.hwndOwner = hwnd;
|
||||||
|
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
|
||||||
|
ofn.lpstrFile = pszFileName;
|
||||||
|
ofn.nMaxFile = MAX_PATH;
|
||||||
|
ofn.lpstrDefExt = "txt";
|
||||||
|
|
||||||
|
if(bSave) {
|
||||||
|
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
|
||||||
|
OFN_OVERWRITEPROMPT;
|
||||||
|
if(!GetSaveFileName(&ofn))
|
||||||
|
return FALSE;
|
||||||
|
} else {
|
||||||
|
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
|
||||||
|
if(!GetOpenFileName(&ofn))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdParam, int nCmdShow) {
|
||||||
|
MSG Msg;
|
||||||
|
WNDCLASSEX WndClassEx;
|
||||||
|
|
||||||
|
g_hInst = hInstance;
|
||||||
|
|
||||||
|
WndClassEx.cbSize = sizeof(WNDCLASSEX);
|
||||||
|
WndClassEx.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
|
WndClassEx.lpfnWndProc = WndProc;
|
||||||
|
WndClassEx.cbClsExtra = 0;
|
||||||
|
WndClassEx.cbWndExtra = 0;
|
||||||
|
WndClassEx.hInstance = hInstance;
|
||||||
|
WndClassEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||||
|
WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
WndClassEx.hbrBackground = (HBRUSH)(COLOR_3DSHADOW+1);
|
||||||
|
WndClassEx.lpszMenuName = "MAIN";
|
||||||
|
WndClassEx.lpszClassName = g_szAppName;
|
||||||
|
WndClassEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
||||||
|
|
||||||
|
if(!RegisterClassEx(&WndClassEx)) {
|
||||||
|
MessageBox(0, "Could Not Register Window", "Oh Oh...",MB_ICONEXCLAMATION | MB_OK);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
WndClassEx.lpfnWndProc = MDIChildWndProc;
|
||||||
|
WndClassEx.lpszMenuName = NULL;
|
||||||
|
WndClassEx.lpszClassName = g_szChild;
|
||||||
|
WndClassEx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
|
||||||
|
|
||||||
|
if(!RegisterClassEx(&WndClassEx)) {
|
||||||
|
MessageBox(0, "Could Not Register Child Window", "Oh Oh...",
|
||||||
|
MB_ICONEXCLAMATION | MB_OK);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_hMainWindow = CreateWindowEx(WS_EX_APPWINDOW,g_szAppName,"MDI File Editor",WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
0, 0, hInstance, NULL);
|
||||||
|
|
||||||
|
if (g_hMainWindow == NULL){
|
||||||
|
MessageBox(0, "No Window", "Oh Oh...", MB_ICONEXCLAMATION | MB_OK);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowWindow(g_hMainWindow, nCmdShow);
|
||||||
|
UpdateWindow(g_hMainWindow);
|
||||||
|
|
||||||
|
while(GetMessage(&Msg, NULL, 0, 0)) {
|
||||||
|
if (!TranslateMDISysAccel(g_hMDIClient, &Msg)) {
|
||||||
|
TranslateMessage(&Msg);
|
||||||
|
DispatchMessage(&Msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Msg.wParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
|
||||||
|
switch(Message) {
|
||||||
|
case WM_CREATE: {
|
||||||
|
CLIENTCREATESTRUCT ccs;
|
||||||
|
int iStatusWidths[] = {200, 300, -1};
|
||||||
|
TBADDBITMAP tbab;
|
||||||
|
TBBUTTON tbb[9];
|
||||||
|
|
||||||
|
// Find window menu where children will be listed
|
||||||
|
ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 2);
|
||||||
|
ccs.idFirstChild = ID_MDI_FIRSTCHILD;
|
||||||
|
g_hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE, "mdiclient", NULL,
|
||||||
|
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
|
hwnd, (HMENU)ID_MDI_CLIENT, g_hInst, (LPVOID)&ccs);
|
||||||
|
ShowWindow(g_hMDIClient, SW_SHOW);
|
||||||
|
|
||||||
|
g_hStatusBar = CreateWindowEx(0, STATUSCLASSNAME, NULL,
|
||||||
|
WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0,
|
||||||
|
hwnd, (HMENU)ID_STATUSBAR, g_hInst, NULL);
|
||||||
|
SendMessage(g_hStatusBar, SB_SETPARTS, 3, (LPARAM)iStatusWidths);
|
||||||
|
SendMessage(g_hStatusBar, SB_SETTEXT, 2, (LPARAM)"Toolbar & Statusbar Example");
|
||||||
|
|
||||||
|
g_hToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
|
||||||
|
WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
|
||||||
|
hwnd, (HMENU)ID_TOOLBAR, g_hInst, NULL);
|
||||||
|
|
||||||
|
// Send the TB_BUTTONSTRUCTSIZE message, which is required for
|
||||||
|
// backward compatibility.
|
||||||
|
SendMessage(g_hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
|
||||||
|
|
||||||
|
tbab.hInst = HINST_COMMCTRL;
|
||||||
|
tbab.nID = IDB_STD_SMALL_COLOR;
|
||||||
|
SendMessage(g_hToolBar, TB_ADDBITMAP, 0, (LPARAM)&tbab);
|
||||||
|
|
||||||
|
ZeroMemory(tbb, sizeof(tbb));
|
||||||
|
|
||||||
|
tbb[0].iBitmap = STD_FILENEW;
|
||||||
|
tbb[0].fsState = TBSTATE_ENABLED;
|
||||||
|
tbb[0].fsStyle = TBSTYLE_BUTTON;
|
||||||
|
tbb[0].idCommand = CM_FILE_NEW;
|
||||||
|
|
||||||
|
tbb[1].iBitmap = STD_FILEOPEN;
|
||||||
|
tbb[1].fsState = TBSTATE_ENABLED;
|
||||||
|
tbb[1].fsStyle = TBSTYLE_BUTTON;
|
||||||
|
tbb[1].idCommand = CM_FILE_OPEN;
|
||||||
|
|
||||||
|
tbb[2].iBitmap = STD_FILESAVE;
|
||||||
|
tbb[2].fsStyle = TBSTYLE_BUTTON;
|
||||||
|
tbb[2].idCommand = CM_FILE_SAVE;
|
||||||
|
|
||||||
|
tbb[3].fsStyle = TBSTYLE_SEP;
|
||||||
|
|
||||||
|
tbb[4].iBitmap = STD_CUT;
|
||||||
|
tbb[4].fsStyle = TBSTYLE_BUTTON;
|
||||||
|
tbb[4].idCommand = CM_EDIT_CUT;
|
||||||
|
|
||||||
|
tbb[5].iBitmap = STD_COPY;
|
||||||
|
tbb[5].fsStyle = TBSTYLE_BUTTON;
|
||||||
|
tbb[5].idCommand = CM_EDIT_COPY;
|
||||||
|
|
||||||
|
tbb[6].iBitmap = STD_PASTE;
|
||||||
|
tbb[6].fsStyle = TBSTYLE_BUTTON;
|
||||||
|
tbb[6].idCommand = CM_EDIT_PASTE;
|
||||||
|
|
||||||
|
tbb[7].fsStyle = TBSTYLE_SEP;
|
||||||
|
|
||||||
|
tbb[8].iBitmap = STD_UNDO;
|
||||||
|
tbb[8].fsStyle = TBSTYLE_BUTTON;
|
||||||
|
tbb[8].idCommand = CM_EDIT_UNDO;
|
||||||
|
|
||||||
|
SendMessage(g_hToolBar, TB_ADDBUTTONS, 9, (LPARAM)&tbb);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
case WM_COMMAND: {
|
||||||
|
switch(LOWORD(wParam)) {
|
||||||
|
case CM_FILE_EXIT:
|
||||||
|
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
||||||
|
break;
|
||||||
|
case CM_FILE_NEW: {
|
||||||
|
MDICREATESTRUCT mcs;
|
||||||
|
HWND hChild;
|
||||||
|
|
||||||
|
mcs.szTitle = "[Untitled]";
|
||||||
|
mcs.szClass = g_szChild;
|
||||||
|
mcs.hOwner = g_hInst;
|
||||||
|
mcs.x = mcs.cx = CW_USEDEFAULT;
|
||||||
|
mcs.y = mcs.cy = CW_USEDEFAULT;
|
||||||
|
mcs.style = MDIS_ALLCHILDSTYLES;
|
||||||
|
|
||||||
|
hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE,0, (LPARAM)&mcs);
|
||||||
|
if(!hChild) {
|
||||||
|
MessageBox(hwnd, "MDI Child creation failed.", "Oh Oh...",MB_ICONEXCLAMATION | MB_OK);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CM_FILE_OPEN: {
|
||||||
|
MDICREATESTRUCT mcs;
|
||||||
|
HWND hChild;
|
||||||
|
char szFileName[MAX_PATH];
|
||||||
|
|
||||||
|
if(!GetFileName(hwnd, szFileName, FALSE))
|
||||||
|
break;
|
||||||
|
|
||||||
|
mcs.szTitle = szFileName;
|
||||||
|
mcs.szClass = g_szChild;
|
||||||
|
mcs.hOwner = g_hInst;
|
||||||
|
mcs.x = mcs.cx = CW_USEDEFAULT;
|
||||||
|
mcs.y = mcs.cy = CW_USEDEFAULT;
|
||||||
|
mcs.style = MDIS_ALLCHILDSTYLES;
|
||||||
|
|
||||||
|
hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);
|
||||||
|
|
||||||
|
if(!hChild) {
|
||||||
|
MessageBox(hwnd, "MDI Child creation failed.", "Oh Oh...",
|
||||||
|
MB_ICONEXCLAMATION | MB_OK);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CM_WINDOW_TILEHORZ:
|
||||||
|
PostMessage(g_hMDIClient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
|
||||||
|
break;
|
||||||
|
case CM_WINDOW_TILEVERT:
|
||||||
|
PostMessage(g_hMDIClient, WM_MDITILE, MDITILE_VERTICAL, 0);
|
||||||
|
break;
|
||||||
|
case CM_WINDOW_CASCADE:
|
||||||
|
PostMessage(g_hMDIClient, WM_MDICASCADE, 0, 0);
|
||||||
|
break;
|
||||||
|
case CM_WINDOW_ARRANGE:
|
||||||
|
PostMessage(g_hMDIClient, WM_MDIICONARRANGE, 0, 0);
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
if(LOWORD(wParam) >= ID_MDI_FIRSTCHILD){
|
||||||
|
DefFrameProc(hwnd, g_hMDIClient, Message, wParam, lParam);
|
||||||
|
} else {
|
||||||
|
HWND hChild;
|
||||||
|
hChild = (HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE,0,0);
|
||||||
|
if(hChild){
|
||||||
|
SendMessage(hChild, WM_COMMAND, wParam, lParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_SIZE: {
|
||||||
|
RECT rectClient, rectStatus, rectTool;
|
||||||
|
UINT uToolHeight, uStatusHeight, uClientAlreaHeight;
|
||||||
|
|
||||||
|
SendMessage(g_hToolBar, TB_AUTOSIZE, 0, 0);
|
||||||
|
SendMessage(g_hStatusBar, WM_SIZE, 0, 0);
|
||||||
|
|
||||||
|
GetClientRect(hwnd, &rectClient);
|
||||||
|
GetWindowRect(g_hStatusBar, &rectStatus);
|
||||||
|
GetWindowRect(g_hToolBar, &rectTool);
|
||||||
|
|
||||||
|
uToolHeight = rectTool.bottom - rectTool.top;
|
||||||
|
uStatusHeight = rectStatus.bottom - rectStatus.top;
|
||||||
|
uClientAlreaHeight = rectClient.bottom;
|
||||||
|
|
||||||
|
MoveWindow(g_hMDIClient, 0, uToolHeight, rectClient.right, uClientAlreaHeight - uStatusHeight - uToolHeight, TRUE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_CLOSE:
|
||||||
|
DestroyWindow(hwnd);
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return DefFrameProc(hwnd, g_hMDIClient, Message, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam,LPARAM lParam) {
|
||||||
|
switch(Message) {
|
||||||
|
case WM_CREATE: {
|
||||||
|
char szFileName[MAX_PATH];
|
||||||
|
HWND hEdit;
|
||||||
|
|
||||||
|
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
|
hwnd, (HMENU)IDC_CHILD_EDIT, g_hInst, NULL);
|
||||||
|
|
||||||
|
SendMessage(hEdit, WM_SETFONT,
|
||||||
|
(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
|
||||||
|
|
||||||
|
GetWindowText(hwnd, szFileName, MAX_PATH);
|
||||||
|
if(*szFileName != '[') {
|
||||||
|
if(!LoadFile(hEdit, szFileName)) {
|
||||||
|
MessageBox(hwnd, "Couldn't Load File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
return -1; //cancel window creation
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_SIZE:
|
||||||
|
if(wParam != SIZE_MINIMIZED)
|
||||||
|
MoveWindow(GetDlgItem(hwnd, IDC_CHILD_EDIT), 0, 0, LOWORD(lParam),HIWORD(lParam), TRUE);
|
||||||
|
break;
|
||||||
|
case WM_MDIACTIVATE: {
|
||||||
|
HMENU hMenu, hFileMenu;
|
||||||
|
BOOL EnableFlag;
|
||||||
|
char szFileName[MAX_PATH];
|
||||||
|
|
||||||
|
hMenu = GetMenu(g_hMainWindow);
|
||||||
|
if(hwnd == (HWND)lParam){ //being activated
|
||||||
|
EnableFlag = TRUE;
|
||||||
|
} else{
|
||||||
|
EnableFlag = FALSE; //being de-activated
|
||||||
|
}
|
||||||
|
EnableMenuItem(hMenu, 1, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||||
|
EnableMenuItem(hMenu, 2, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||||
|
|
||||||
|
hFileMenu = GetSubMenu(hMenu, 0);
|
||||||
|
EnableMenuItem(hFileMenu, CM_FILE_SAVE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||||
|
EnableMenuItem(hFileMenu, CM_FILE_SAVEAS, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||||
|
|
||||||
|
DrawMenuBar(g_hMainWindow);
|
||||||
|
|
||||||
|
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_FILE_SAVE, MAKELONG(EnableFlag, 0));
|
||||||
|
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_UNDO, MAKELONG(EnableFlag, 0));
|
||||||
|
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_CUT, MAKELONG(EnableFlag, 0));
|
||||||
|
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_COPY, MAKELONG(EnableFlag, 0));
|
||||||
|
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_PASTE, MAKELONG(EnableFlag, 0));
|
||||||
|
|
||||||
|
GetWindowText(hwnd, szFileName, MAX_PATH);
|
||||||
|
SendMessage(g_hStatusBar, SB_SETTEXT, 0, (LPARAM)(EnableFlag ? szFileName : ""));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_SETFOCUS:
|
||||||
|
SetFocus(GetDlgItem(hwnd, IDC_CHILD_EDIT));
|
||||||
|
break;
|
||||||
|
case WM_COMMAND: {
|
||||||
|
switch(LOWORD(wParam)) {
|
||||||
|
case CM_FILE_SAVE: {
|
||||||
|
char szFileName[MAX_PATH];
|
||||||
|
|
||||||
|
GetWindowText(hwnd, szFileName, MAX_PATH);
|
||||||
|
if(*szFileName != '[') {
|
||||||
|
if(!SaveFile(GetDlgItem(hwnd, IDC_CHILD_EDIT), szFileName)) {
|
||||||
|
MessageBox(hwnd, "Couldn't Save File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(CM_FILE_SAVEAS, 0), 0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
case CM_FILE_SAVEAS: {
|
||||||
|
char szFileName[MAX_PATH];
|
||||||
|
|
||||||
|
if(GetFileName(hwnd, szFileName, TRUE)) {
|
||||||
|
if(!SaveFile(GetDlgItem(hwnd, IDC_CHILD_EDIT), szFileName)) {
|
||||||
|
MessageBox(hwnd, "Couldn't Save File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
SetWindowText(hwnd, szFileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
case CM_EDIT_UNDO:
|
||||||
|
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, EM_UNDO, 0, 0);
|
||||||
|
break;
|
||||||
|
case CM_EDIT_CUT:
|
||||||
|
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_CUT, 0, 0);
|
||||||
|
break;
|
||||||
|
case CM_EDIT_COPY:
|
||||||
|
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_COPY, 0, 0);
|
||||||
|
break;
|
||||||
|
case CM_EDIT_PASTE:
|
||||||
|
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_PASTE, 0, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefMDIChildProc(hwnd, Message, wParam, lParam);
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
#define CM_WINDOW_TILEVERT 9080
|
||||||
|
#define CM_WINDOW_TILEHORZ 9082
|
||||||
|
#define CM_WINDOW_ARRANGE 9081
|
||||||
|
#define CM_WINDOW_TILE 9080
|
||||||
|
#define CM_WINDOW_CASCADE 9076
|
||||||
|
#define CM_EDIT_PASTE 9079
|
||||||
|
#define CM_EDIT_COPY 9078
|
||||||
|
#define CM_EDIT_CUT 9077
|
||||||
|
#define CM_EDIT_REDO 9076
|
||||||
|
#define CM_EDIT_UNDO 9075
|
||||||
|
#define CM_FILE_SAVEAS 9074
|
||||||
|
#define CM_FILE_SAVE 9073
|
||||||
|
#define CM_FILE_OPEN 9072
|
||||||
|
#define CM_HELP_ABOUT 9072
|
||||||
|
#define CM_FILE_EXIT 9071
|
||||||
|
#define CM_FILE_NEW 9070
|
||||||
|
|
||||||
|
#define ID_STATUSBAR 4997
|
||||||
|
#define ID_TOOLBAR 4998
|
||||||
|
|
||||||
|
#define ID_MDI_CLIENT 4999
|
||||||
|
#define ID_MDI_FIRSTCHILD 50000
|
||||||
|
|
||||||
|
#define IDC_CHILD_EDIT 2000
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
MAIN MENU
|
||||||
|
{
|
||||||
|
POPUP "&File"
|
||||||
|
{
|
||||||
|
MENUITEM "&New", CM_FILE_NEW
|
||||||
|
MENUITEM "&Open...", CM_FILE_OPEN
|
||||||
|
MENUITEM "&Save", CM_FILE_SAVE, GRAYED
|
||||||
|
MENUITEM "Save &As...", CM_FILE_SAVEAS, GRAYED
|
||||||
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "E&xit", CM_FILE_EXIT
|
||||||
|
}
|
||||||
|
|
||||||
|
POPUP "&Edit", GRAYED
|
||||||
|
{
|
||||||
|
MENUITEM "&Undo\tCtrl+Z", CM_EDIT_UNDO
|
||||||
|
MENUITEM SEPARATOR
|
||||||
|
MENUITEM "Cu&t\tCtrl+X", CM_EDIT_CUT
|
||||||
|
MENUITEM "&Copy\tCtrl+C", CM_EDIT_COPY
|
||||||
|
MENUITEM "&Paste\tCtrl+V", CM_EDIT_PASTE
|
||||||
|
}
|
||||||
|
|
||||||
|
POPUP "&Window", GRAYED
|
||||||
|
{
|
||||||
|
MENUITEM "&Cascade", CM_WINDOW_CASCADE
|
||||||
|
MENUITEM "Tile &Horizontal", CM_WINDOW_TILEHORZ
|
||||||
|
MENUITEM "Tile &Vertical", CM_WINDOW_TILEVERT
|
||||||
|
MENUITEM "Arrange &Icons", CM_WINDOW_ARRANGE
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=OpenGL
|
||||||
|
Icon=Pizza.ico
|
||||||
|
Description=A basic OpenGL program
|
||||||
|
Category=Multimedia
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=OpenGL.txt
|
||||||
|
Cpp=OpenGL.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=0
|
||||||
|
Linker=-lopengl32
|
|
@ -0,0 +1,190 @@
|
||||||
|
/**************************
|
||||||
|
* Includes
|
||||||
|
*
|
||||||
|
**************************/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <gl/gl.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**************************
|
||||||
|
* Function Declarations
|
||||||
|
*
|
||||||
|
**************************/
|
||||||
|
|
||||||
|
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
|
||||||
|
WPARAM wParam, LPARAM lParam);
|
||||||
|
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
|
||||||
|
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
|
||||||
|
|
||||||
|
|
||||||
|
/**************************
|
||||||
|
* WinMain
|
||||||
|
*
|
||||||
|
**************************/
|
||||||
|
|
||||||
|
int WINAPI WinMain (HINSTANCE hInstance,
|
||||||
|
HINSTANCE hPrevInstance,
|
||||||
|
LPSTR lpCmdLine,
|
||||||
|
int iCmdShow)
|
||||||
|
{
|
||||||
|
WNDCLASS wc;
|
||||||
|
HWND hWnd;
|
||||||
|
HDC hDC;
|
||||||
|
HGLRC hRC;
|
||||||
|
MSG msg;
|
||||||
|
BOOL bQuit = FALSE;
|
||||||
|
float theta = 0.0f;
|
||||||
|
|
||||||
|
/* register window class */
|
||||||
|
wc.style = CS_OWNDC;
|
||||||
|
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 (BLACK_BRUSH);
|
||||||
|
wc.lpszMenuName = NULL;
|
||||||
|
wc.lpszClassName = "GLSample";
|
||||||
|
RegisterClass (&wc);
|
||||||
|
|
||||||
|
/* create main window */
|
||||||
|
hWnd = CreateWindow (
|
||||||
|
"GLSample", "OpenGL Sample",
|
||||||
|
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
|
||||||
|
0, 0, 256, 256,
|
||||||
|
NULL, NULL, hInstance, NULL);
|
||||||
|
|
||||||
|
/* enable OpenGL for the window */
|
||||||
|
EnableOpenGL (hWnd, &hDC, &hRC);
|
||||||
|
|
||||||
|
/* program main loop */
|
||||||
|
while (!bQuit)
|
||||||
|
{
|
||||||
|
/* check for messages */
|
||||||
|
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
|
||||||
|
{
|
||||||
|
/* handle or dispatch messages */
|
||||||
|
if (msg.message == WM_QUIT)
|
||||||
|
{
|
||||||
|
bQuit = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TranslateMessage (&msg);
|
||||||
|
DispatchMessage (&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* OpenGL animation code goes here */
|
||||||
|
|
||||||
|
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
glClear (GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glPushMatrix ();
|
||||||
|
glRotatef (theta, 0.0f, 0.0f, 1.0f);
|
||||||
|
glBegin (GL_TRIANGLES);
|
||||||
|
glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f);
|
||||||
|
glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.87f, -0.5f);
|
||||||
|
glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f);
|
||||||
|
glEnd ();
|
||||||
|
glPopMatrix ();
|
||||||
|
|
||||||
|
SwapBuffers (hDC);
|
||||||
|
|
||||||
|
theta += 1.0f;
|
||||||
|
Sleep (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* shutdown OpenGL */
|
||||||
|
DisableOpenGL (hWnd, hDC, hRC);
|
||||||
|
|
||||||
|
/* destroy the window explicitly */
|
||||||
|
DestroyWindow (hWnd);
|
||||||
|
|
||||||
|
return msg.wParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************
|
||||||
|
* Window Procedure
|
||||||
|
*
|
||||||
|
********************/
|
||||||
|
|
||||||
|
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
|
||||||
|
WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (message)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
return 0;
|
||||||
|
case WM_CLOSE:
|
||||||
|
PostQuitMessage (0);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
switch (wParam)
|
||||||
|
{
|
||||||
|
case VK_ESCAPE:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return DefWindowProc (hWnd, message, wParam, lParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************
|
||||||
|
* Enable OpenGL
|
||||||
|
*
|
||||||
|
*******************/
|
||||||
|
|
||||||
|
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
|
||||||
|
{
|
||||||
|
PIXELFORMATDESCRIPTOR pfd;
|
||||||
|
int iFormat;
|
||||||
|
|
||||||
|
/* get the device context (DC) */
|
||||||
|
*hDC = GetDC (hWnd);
|
||||||
|
|
||||||
|
/* set the pixel format for the DC */
|
||||||
|
ZeroMemory (&pfd, sizeof (pfd));
|
||||||
|
pfd.nSize = sizeof (pfd);
|
||||||
|
pfd.nVersion = 1;
|
||||||
|
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
|
||||||
|
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
|
||||||
|
pfd.iPixelType = PFD_TYPE_RGBA;
|
||||||
|
pfd.cColorBits = 24;
|
||||||
|
pfd.cDepthBits = 16;
|
||||||
|
pfd.iLayerType = PFD_MAIN_PLANE;
|
||||||
|
iFormat = ChoosePixelFormat (*hDC, &pfd);
|
||||||
|
SetPixelFormat (*hDC, iFormat, &pfd);
|
||||||
|
|
||||||
|
/* create and enable the render context (RC) */
|
||||||
|
*hRC = wglCreateContext( *hDC );
|
||||||
|
wglMakeCurrent( *hDC, *hRC );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/******************
|
||||||
|
* Disable OpenGL
|
||||||
|
*
|
||||||
|
******************/
|
||||||
|
|
||||||
|
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
|
||||||
|
{
|
||||||
|
wglMakeCurrent (NULL, NULL);
|
||||||
|
wglDeleteContext (hRC);
|
||||||
|
ReleaseDC (hWnd, hDC);
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=OpenMP
|
||||||
|
Icon=File Management.ico
|
||||||
|
Description=A OpenMP multithreading example
|
||||||
|
Category=Console
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=OpenMP_c.txt
|
||||||
|
Cpp=OpenMP_cpp.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=1
|
||||||
|
Compiler=-fopenmp
|
||||||
|
CppCompiler=-fopenmp
|
||||||
|
Linker=-lgomp
|
|
@ -0,0 +1,17 @@
|
||||||
|
#include <omp.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#pragma omp parallel num_threads(2)
|
||||||
|
printf("Hi, I'm thread number %d!\n",omp_get_thread_num());
|
||||||
|
|
||||||
|
#pragma omp parallel for num_threads(2)
|
||||||
|
for(i = 0;i < 20;i++) {
|
||||||
|
printf("\nThread number %d, executing iteration %d...",omp_get_thread_num(),i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#include <omp.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
// not using iostream here due to output ordering issues
|
||||||
|
|
||||||
|
// iostream tends to output each part between <<'s separately to the console,
|
||||||
|
// which can lead to random output if multiple threads are doing the same
|
||||||
|
// thing.
|
||||||
|
|
||||||
|
// printf will generally output the whole result string in one go, so results
|
||||||
|
// of separate printf calls, even from different threads, will remain intact
|
||||||
|
|
||||||
|
// Another fix, other than using printf, would be to give each thread its own
|
||||||
|
// place to store output temporarily (a stringstream), and then output the whole
|
||||||
|
// result in one go.
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
#pragma omp parallel num_threads(2)
|
||||||
|
printf("Hi, I'm thread number %d!\n",omp_get_thread_num());
|
||||||
|
|
||||||
|
#pragma omp parallel for num_threads(2)
|
||||||
|
for(int i = 0;i < 20;i++) {
|
||||||
|
printf("\nThread number %d, executing iteration %d...",omp_get_thread_num(),i);
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 766 B |
After Width: | Height: | Size: 766 B |
|
@ -0,0 +1,28 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Single Dialog Application
|
||||||
|
Icon=Single Dialog Application.ico
|
||||||
|
Description=An Appliction use a dialog as the main UI
|
||||||
|
Category=Win32
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
C=Single_Dialog_Application_main.c.txt
|
||||||
|
[Unit1]
|
||||||
|
CName=resource.rc
|
||||||
|
C=Single_Dialog_Application_resource.rc.txt
|
||||||
|
[Unit2]
|
||||||
|
CName=resource.h
|
||||||
|
C=Single_Dialog_Application_resource.h.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=3
|
||||||
|
Type=0
|
||||||
|
IsCpp=0
|
||||||
|
Compiler=
|
||||||
|
CppCompiler=
|
||||||
|
Linker=
|
||||||
|
CompilerSettings=0000000000000000000000000
|
||||||
|
CompilerSet=0
|
||||||
|
IncludeVersionInfo=0
|
||||||
|
SupportXPThemes=0
|
||||||
|
Icon=Single Dialog Application.project.ico
|
|
@ -0,0 +1,42 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
HINSTANCE hInst;
|
||||||
|
|
||||||
|
LRESULT MainDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
|
||||||
|
MSG msg;
|
||||||
|
HWND hMainDlg = NULL;
|
||||||
|
|
||||||
|
hInst = hInstance;
|
||||||
|
hMainDlg = CreateDialog(hInstance, (LPCTSTR)IDD_MAIN_DIALOG, 0,(DLGPROC)MainDlgProc);
|
||||||
|
ShowWindow(hMainDlg, nCmdShow);
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT MainDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||||
|
switch (message) {
|
||||||
|
case WM_INITDIALOG :
|
||||||
|
return TRUE ;
|
||||||
|
case WM_COMMAND :
|
||||||
|
switch (LOWORD (wParam)) {
|
||||||
|
case IDOK :
|
||||||
|
case IDCANCEL :
|
||||||
|
DestroyWindow(hDlg);
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
case WM_CLOSE:
|
||||||
|
DestroyWindow(hDlg);
|
||||||
|
return TRUE;
|
||||||
|
case WM_DESTROY:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return TRUE;
|
||||||
|
};
|
||||||
|
return FALSE;//返回FALSE给缺省对话框函数DefDlgProc(),表示没有处理本消息
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
#ifndef IDC_STATIC
|
||||||
|
#define IDC_STATIC (-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IDD_MAIN_DIALOG 101
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Generated by ResEdit 1.6.5
|
||||||
|
// Copyright (C) 2006-2015
|
||||||
|
// http://www.resedit.net
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <commctrl.h>
|
||||||
|
#include <richedit.h>
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Dialog resources
|
||||||
|
//
|
||||||
|
LANGUAGE 0, SUBLANG_NEUTRAL
|
||||||
|
IDD_MAIN_DIALOG DIALOG 0, 0, 186, 95
|
||||||
|
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
|
||||||
|
CAPTION "Dialog"
|
||||||
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
{
|
||||||
|
PUSHBUTTON "Cancel", IDCANCEL, 129, 24, 50, 14, 0, WS_EX_LEFT
|
||||||
|
DEFPUSHBUTTON "OK", IDOK, 129, 7, 50, 14, 0, WS_EX_LEFT
|
||||||
|
}
|
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,19 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=std::thread
|
||||||
|
Icon=Software.ico
|
||||||
|
Description=A C++ multithreading example
|
||||||
|
Category=Console
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=StdThread_c.txt
|
||||||
|
Cpp=StdThread_cpp.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=1
|
||||||
|
Type=1
|
||||||
|
Compiler=
|
||||||
|
CppCompiler=-std=gnu++11
|
||||||
|
Linker=
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Please note that MinGW32 compilers currently do not support <thread>. Use MinGW64 builds like TDM-GCC instead.
|
||||||
|
// C does not support this magic ;)
|
|
@ -0,0 +1,43 @@
|
||||||
|
// Please note that MinGW32 compilers currently do not support <thread>. Use MinGW64 builds like TDM-GCC instead.
|
||||||
|
|
||||||
|
#include <thread>
|
||||||
|
using std::thread;
|
||||||
|
#include <vector>
|
||||||
|
using std::vector;
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
struct ThreadItem {
|
||||||
|
char* result; // could've used stringstream too, but don't like their syntax
|
||||||
|
thread worker;
|
||||||
|
};
|
||||||
|
|
||||||
|
void* ThreadFunction(char** result) {
|
||||||
|
*result = new char[256];
|
||||||
|
snprintf(*result,256,"Hello World from thread ID %d",
|
||||||
|
std::this_thread::get_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// Get the amount of "processing units"
|
||||||
|
int n = std::thread::hardware_concurrency();
|
||||||
|
|
||||||
|
// Create array of threads
|
||||||
|
vector<ThreadItem> threadlist;
|
||||||
|
threadlist.resize(n);
|
||||||
|
|
||||||
|
// Spawn a thread for each core
|
||||||
|
for(int i = 0;i < n;i++) {
|
||||||
|
threadlist[i].worker = thread(ThreadFunction,&threadlist[i].result); // pass rand() as data argument
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for them all to finish
|
||||||
|
for(int i = 0;i < n;i++) {
|
||||||
|
threadlist[i].worker.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Present their calculation results
|
||||||
|
printf("Results:\n");
|
||||||
|
for(int i = 0;i < n;i++) {
|
||||||
|
printf("%s\n",threadlist[i].result);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
[Template]
|
||||||
|
ver=1
|
||||||
|
Name=Animation Example
|
||||||
|
Icon=Windows.ico
|
||||||
|
Description=A Win32 painting example
|
||||||
|
Category=Win32
|
||||||
|
|
||||||
|
[Unit0]
|
||||||
|
CName=main.c
|
||||||
|
CppName=main.cpp
|
||||||
|
C=WinAnim_c.txt
|
||||||
|
Cpp=WinAnim_c.txt
|
||||||
|
|
||||||
|
[Unit1]
|
||||||
|
CName=resource.rc
|
||||||
|
CppName=resource.rc
|
||||||
|
C=WinAnim_rc.txt
|
||||||
|
Cpp=WinAnim_rc.txt
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
UnitCount=2
|
||||||
|
Type=0
|
|
@ -0,0 +1,191 @@
|
||||||
|
/*
|
||||||
|
Name: WinAnim
|
||||||
|
Author: Brook Miles
|
||||||
|
Description: Making an animation in windows
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
static char g_szClassName[] = "MyWindowClass";
|
||||||
|
static HINSTANCE g_hInst = NULL;
|
||||||
|
|
||||||
|
const UINT idTimer1 = 1;
|
||||||
|
UINT nTimerDelay = 10;
|
||||||
|
|
||||||
|
HBITMAP hbmBall, hbmMask;
|
||||||
|
BITMAP bm;
|
||||||
|
|
||||||
|
int ballX, ballY;
|
||||||
|
int deltaX, deltaY;
|
||||||
|
|
||||||
|
int deltaValue = 4;
|
||||||
|
|
||||||
|
void EraseBall(HDC hdc)
|
||||||
|
{
|
||||||
|
RECT rc;
|
||||||
|
rc.left = ballX;
|
||||||
|
rc.top = ballY;
|
||||||
|
rc.right = ballX + bm.bmWidth;
|
||||||
|
rc.bottom = ballY + bm.bmHeight;
|
||||||
|
FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawBall(HDC hdc)
|
||||||
|
{
|
||||||
|
HDC hdcMemory;
|
||||||
|
hdcMemory = CreateCompatibleDC(hdc);
|
||||||
|
|
||||||
|
SelectObject(hdcMemory, hbmMask);
|
||||||
|
BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCAND);
|
||||||
|
|
||||||
|
SelectObject(hdcMemory, hbmBall);
|
||||||
|
BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCPAINT);
|
||||||
|
|
||||||
|
DeleteDC(hdcMemory);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateBall(HWND hwnd)
|
||||||
|
{
|
||||||
|
RECT rc;
|
||||||
|
GetClientRect(hwnd, &rc);
|
||||||
|
|
||||||
|
ballX += deltaX;
|
||||||
|
ballY += deltaY;
|
||||||
|
|
||||||
|
if(ballX < 0){
|
||||||
|
ballX = 0;
|
||||||
|
deltaX = deltaValue;
|
||||||
|
}
|
||||||
|
else if(ballX + bm.bmWidth > rc.right){
|
||||||
|
ballX = rc.right - bm.bmWidth;
|
||||||
|
deltaX = -deltaValue;
|
||||||
|
}
|
||||||
|
if(ballY < 0){
|
||||||
|
ballY = 0;
|
||||||
|
deltaY = deltaValue;
|
||||||
|
}
|
||||||
|
else if(ballY + bm.bmHeight > rc.bottom){
|
||||||
|
ballY = rc.bottom - bm.bmHeight;
|
||||||
|
deltaY = -deltaValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch(Message)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
hbmBall = LoadBitmap(g_hInst, "BALLBMP");
|
||||||
|
hbmMask = LoadBitmap(g_hInst, "MASKBMP");
|
||||||
|
if(!hbmBall || !hbmMask){
|
||||||
|
MessageBox(hwnd, "Load of resources failed.", "Error",
|
||||||
|
MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetObject(hbmBall, sizeof(bm), &bm);
|
||||||
|
SetTimer(hwnd, idTimer1, nTimerDelay, NULL);
|
||||||
|
|
||||||
|
ballX = 0;
|
||||||
|
ballY = 0;
|
||||||
|
deltaX = deltaValue;
|
||||||
|
deltaY = deltaValue;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case WM_TIMER:
|
||||||
|
if(hbmBall && hbmMask)
|
||||||
|
{
|
||||||
|
HDC hdcWindow;
|
||||||
|
hdcWindow = GetDC(hwnd);
|
||||||
|
|
||||||
|
EraseBall(hdcWindow);
|
||||||
|
UpdateBall(hwnd);
|
||||||
|
DrawBall(hdcWindow);
|
||||||
|
|
||||||
|
ReleaseDC(hwnd, hdcWindow);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_PAINT:
|
||||||
|
if(hbmBall && hbmMask)
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HDC hdcWindow;
|
||||||
|
hdcWindow = BeginPaint(hwnd, &ps);
|
||||||
|
|
||||||
|
DrawBall(hdcWindow);
|
||||||
|
|
||||||
|
EndPaint(hwnd, &ps);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WM_CLOSE:
|
||||||
|
DestroyWindow(hwnd);
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
KillTimer(hwnd, idTimer1);
|
||||||
|
|
||||||
|
DeleteObject(hbmBall);
|
||||||
|
DeleteObject(hbmMask);
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return DefWindowProc(hwnd, Message, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||||
|
LPSTR lpCmdLine, int nCmdShow)
|
||||||
|
{
|
||||||
|
WNDCLASSEX WndClass;
|
||||||
|
HWND hwnd;
|
||||||
|
MSG Msg;
|
||||||
|
|
||||||
|
g_hInst = hInstance;
|
||||||
|
|
||||||
|
WndClass.cbSize = sizeof(WNDCLASSEX);
|
||||||
|
WndClass.style = 0;
|
||||||
|
WndClass.lpfnWndProc = WndProc;
|
||||||
|
WndClass.cbClsExtra = 0;
|
||||||
|
WndClass.cbWndExtra = 0;
|
||||||
|
WndClass.hInstance = g_hInst;
|
||||||
|
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||||
|
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
|
||||||
|
WndClass.lpszMenuName = NULL;
|
||||||
|
WndClass.lpszClassName = g_szClassName;
|
||||||
|
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
||||||
|
|
||||||
|
if(!RegisterClassEx(&WndClass))
|
||||||
|
{
|
||||||
|
MessageBox(0, "Window Registration Failed!", "Error!",
|
||||||
|
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hwnd = CreateWindowEx(
|
||||||
|
WS_EX_CLIENTEDGE,
|
||||||
|
g_szClassName,
|
||||||
|
"A Bitmap Program",
|
||||||
|
WS_OVERLAPPEDWINDOW,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT, 320, 240,
|
||||||
|
NULL, NULL, g_hInst, NULL);
|
||||||
|
|
||||||
|
if(hwnd == NULL)
|
||||||
|
{
|
||||||
|
MessageBox(0, "Window Creation Failed!", "Error!",
|
||||||
|
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowWindow(hwnd, nCmdShow);
|
||||||
|
UpdateWindow(hwnd);
|
||||||
|
|
||||||
|
while(GetMessage(&Msg, NULL, 0, 0))
|
||||||
|
{
|
||||||
|
TranslateMessage(&Msg);
|
||||||
|
DispatchMessage(&Msg);
|
||||||
|
}
|
||||||
|
return Msg.wParam;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
BALLBMP BITMAP "ball.bmp" // can be found in the Templates folder, please copy to the project folder
|
||||||
|
MASKBMP BITMAP "ballmask.bmp" // as above
|
|
@ -0,0 +1,66 @@
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
/* This is where all the input to the window goes to */
|
||||||
|
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
|
||||||
|
switch(Message) {
|
||||||
|
|
||||||
|
/* Upon destruction, tell the main thread to stop */
|
||||||
|
case WM_DESTROY: {
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All other messages (a lot of them) are processed using default procedures */
|
||||||
|
default:
|
||||||
|
return DefWindowProc(hwnd, Message, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The 'main' function of Win32 GUI programs: this is where execution starts */
|
||||||
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
||||||
|
WNDCLASSEX wc; /* A properties struct of our window */
|
||||||
|
HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
|
||||||
|
MSG msg; /* A temporary location for all messages */
|
||||||
|
|
||||||
|
/* zero out the struct and set the stuff we want to modify */
|
||||||
|
memset(&wc,0,sizeof(wc));
|
||||||
|
wc.cbSize = sizeof(WNDCLASSEX);
|
||||||
|
wc.lpfnWndProc = WndProc; /* This is where we will send messages to */
|
||||||
|
wc.hInstance = hInstance;
|
||||||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
|
||||||
|
/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
|
||||||
|
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||||
|
wc.lpszClassName = "WindowClass";
|
||||||
|
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
|
||||||
|
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
|
||||||
|
|
||||||
|
if(!RegisterClassEx(&wc)) {
|
||||||
|
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
|
||||||
|
CW_USEDEFAULT, /* x */
|
||||||
|
CW_USEDEFAULT, /* y */
|
||||||
|
640, /* width */
|
||||||
|
480, /* height */
|
||||||
|
NULL,NULL,hInstance,NULL);
|
||||||
|
|
||||||
|
if(hwnd == NULL) {
|
||||||
|
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This is the heart of our program where all input is processed and
|
||||||
|
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
|
||||||
|
this loop will not produce unreasonably high CPU usage
|
||||||
|
*/
|
||||||
|
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
|
||||||
|
TranslateMessage(&msg); /* Translate key codes to chars if present */
|
||||||
|
DispatchMessage(&msg); /* Send it to WndProc */
|
||||||
|
}
|
||||||
|
return msg.wParam;
|
||||||
|
}
|
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 630 B |
After Width: | Height: | Size: 190 B |