Το προφίλ μας στο Google Plus
0

Ανάπτυξη εφαρμογών σε C# για το .NET [μέρος 10ο]

Σ’ αυτή τη σειρά άρθρων ξεκινήσαμε δειλά δειλά από τα πιο βασικά στοιχεία της C# και φτάσαμε να δημιουργούμε εφαρμογές για το περιβάλλον γραφικών των Windows. Στο παρόν άρθρο θα επεκταθούμε σε ελαφρώς πιο προχωρημένα χαρακτηριστικά αυτής της πανίσχυρης γλώσσας και θα σας αφήσουμε να συνεχίσετε το ταξίδι μόνοι σας.

Στο προηγούμενο τεύχος αναβαθμίσαμε τις λειτουργίες του deltaPad, ενός απλού text editor που θα θέλαμε να αντικαταστήσει πλήρως το Notepad των Windows. Ο στόχος επετεύχθη αρκετά εύκολα και προχωρήσαμε παραπέρα, εξετάζοντας και κάποιες βελτιώσεις. Στο παρόν άρθρο θα ασχοληθούμε και πάλι με το deltaPad, αλλά δεν θα περιοριστούμε σ’ αυτό. Θα ξεκινήσουμε με μια ενδιαφέρουσα προσθήκη στις δυνατότητες του μικρού μας editor και στη συνέχεια θα περάσουμε σε κάποια άσχετα θέματα, που αναδεικνύουν την ευελιξία της C#.

Όλα τα παραθυρικά περιβάλλοντα, από την εποχή που έκαναν την πρώτη τους εμφάνιση στο Xerox PARC (1967), διέθεταν τη λειτουργία του drag’n’drop. Οι προγραμματιστές είχαν σκεφτεί από τότε την ευκολία που θα προσέφερε η ικανότητα να “σέρνεις” κάτι και να το “αποθέτεις” πάνω σε κάτι άλλο, χρησιμοποιώντας το ποντίκι ή άλλες παρεμφερείς συσκευές εισόδου, όπως τα touch tablets (οι πρόγονοι των γνωστών touchpads). Το drag’n’drop βέβαια δεν χρειάζεται συστάσεις και είναι περισσότερο από ότι το έχετε ήδη χρησιμοποιήσει (π.χ., για να “ρίξετε” ένα ή περισσότερα αρχεία σε κάποιο πρόγραμμα επεξεργασίας, για τη μεταφορά κειμένου από ένα σημείο σε κάποιο άλλο κ.ο.κ.). Η τελευταία προσθήκη που θα κάνουμε στο deltaPad, αφορά ακριβώς στην υποστήριξη του drag’n’drop.

Ένας υπολογιστής Xerox Alto (1973), εφοδιασμένος με το πρώτο παραθυρικό περιβάλλον εργασίας. Δίπλα του φαίνεται ένα ποντίκι (δεξιά) και ένα touch tablet (αριστερά), ο πρόγονος των touchpads.

Ένας υπολογιστής Xerox Alto (1973), εφοδιασμένος με το πρώτο παραθυρικό περιβάλλον εργασίας. Δίπλα του φαίνεται ένα ποντίκι (δεξιά) και ένα touch tablet (αριστερά), ο πρόγονος των touchpads.

Drag’n’drop στο deltaPad
Αρκετοί από εσάς μπορεί να το έχετε διαπιστώσει ήδη: Το deltaPad δεν επιτρέπει τη μεταφορά και την απόθεση κειμένου, ενώ αν του “πετάξουμε” ένα αρχείο κειμένου δεν θα κάνει τίποτα. Δεν θα πρέπει να σας παραξενεύει αυτό. Το drag’n’drop δεν αποτελεί αποκλειστική υπόθεση του λειτουργικού συστήματος. Φυσικά, η πράξη της απόθεσης εντοπίζεται από το σύστημα, το οποίο σπεύδει να ενημερώσει την εκάστοτε εφαρμογή. Ωστόσο ο χειρισμός αυτών των συμβάντων αποτελεί ευθύνη της εκάστοτε εφαρμογής. Με άλλα λόγια, αν μια εφαρμογή δεν διαθέτει την κατάλληλη πρόβλεψη, ότι κι αν κάνει ο χρήστης με το ποντίκι, όσο έξυπνο κι αν είναι το λειτουργικό σύστημα, δεν θα συμβεί τίποτα. Για τη λειτουργία του drag’n’drop απαιτείται η παρουσία των κατάλληλων event handlers. Ο πίνακας που ακολουθεί περιλαμβάνει τα κυριότερα events που παράγονται από τα Windows και σχετίζονται με τη λειτουργία drag’n’drop.

DragEnter	Λαμβάνει χώρα μόλις ο χρήστης σύρει κάποιο στοιχείο
			σε περιοχή που είναι ενεργοποιημένη η λειτουργία
			drag'n'drop.

DragOver	Πυροδοτείται κατ' επανάληψη καθ' όλη τη διάρκεια που
			ο χρήστης μετακινεί με το ποντίκι του κάτι πάνω από
			μια περιοχή drag'n'drop.

DragLeave	Πυροδοτείται όταν το ποντίκι εξέλθει από την επιφάνεια
			που δέχεται το drag'n'drop.

DragDrop	Το βασικότερο συμβάν που πυροδοτείται μόλις ο χρήσης
			απελευθερώσει το κουμπί του ποντικιού του, όταν δηλαδή
			αποθέσει το στοιχείο που σύρει κατά τη διάρκεια του
			drag'n'drop.

Στο deltaPad θα αξιοποιήσουμε το πρώτο και το τέταρτο event. Με το πρώτο θα δημιουργούμε ένα οπτικό αποτέλεσμα που θα ενημερώνει το χρήστη ότι το drag’n’drop λειτουργεί, ενώ με το δεύτερο θα πραγματοποιείται ο χειρισμός των στοιχείων που απέθεσε ο χρήστης. Αν πρόκειται για κείμενο, θα εισάγεται στο σημείο όπου βρίσκεται ο κέρσορας. Αν πρόκειται για κάποιο αρχείο, θα εκτελείται η διαδικασία ανοίγματος και το περιεχόμενό του θα εμφανίζεται στο παράθυρο του editor.

Το πληκτρολόγιο του υπολογιστή Xerox Star (1981) έφερε ειδικά κουμπιά για τις διάφορες χρήσεις του ποντικιού στο πρώιμο περιβάλλον γραφικών του. Ανάμεσα σε άλλα, το drag'n'drop πραγματοποιούνταν με τη βοήθεια του κουμπιού move.

Το πληκτρολόγιο του υπολογιστή Xerox Star (1981) έφερε ειδικά κουμπιά για τις διάφορες χρήσεις του ποντικιού στο πρώιμο περιβάλλον γραφικών του. Ανάμεσα σε άλλα, το drag’n’drop πραγματοποιούνταν με τη βοήθεια του κουμπιού move.

Το drag’n’drop θέλουμε να λειτουργεί επάνω στο textbox, εφόσον εκεί εμφανίζεται όποιο αρχείο έχουμε ανοίξει. Εξάλλου, το textbox καταλαμβάνει το μεγαλύτερο μέρος του παραθύρου του προγράμματος κι αποτελεί τον πιο εύκολο “στόχο” για την απόθεση αρχείων. Για να δημιουργήσουμε τους χειριστές για τα δύο events που αναφέραμε παραπάνω, επιλέγουμε το textbox και μεταβαίνουμε στο παράθυρο “Ιδιότητες”, από όπου και θέτουμε την ιδιότητα AllowDrop σε true. Κατόπιν μεταβαίνουμε στην καρτέλα “Συμβάντα” του ίδιου παραθύρου και προσθέτουμε τις μεθόδους με τον γνωστό τρόπο. Ας δούμε τώρα τον κώδικα που περιλαμβάνει η μέθοδος χειρισμού του DragEnter:

if (e.Data.GetDataPresent(DataFormats.FileDrop) ||
	e.Data.GetDataPresent(DataFormats.Text)) {
		e.Effect = DragDropEffects.Copy ;
}

Η παράμετρος e, που παρέχεται αυτόματα στη μέθοδο χειρισμού του event, αποτελεί αντικείμενο της κλάσης DragEventArgs. Με τον έλεγχο if τσεκάρουμε αν τα δεδομένα που έχουν “συρθεί” είναι τύπου FileDrop ή Text. Με άλλα λόγια, τσεκάρουμε αν πρόκειται για κάποιο αρχείο ή για κείμενο. Σε αυτές τις δύο περιπτώσεις αποδίδουμε στην ιδιότητα Effect την τιμή Copy, της απαρίθμησης DragDropEffects. Αυτό έχει το εξής αποτέλεσμα: Τη στιγμή που ο χρήστης σέρνει με το ποντίκι του κάποιο αρχείο ή κάποιο τμήμα κειμένου, ο δείκτης του ποντικού αλλάζει και προστίθεται στην όψη του ένα “+”. Σε ό,τι αφορά στο δικό μας πρόγραμμα (τον παραλήπτη των δεδομένων) το “effect” δεν επιδρά και στη συγκεκριμένη περίπτωση (Copy) δεν πετυχαίνει τίποτα, πέρα από το να ενημερώνει το χρήστη ότι το drag’n’drop λειτουργεί. Αντίθετα, σε ό,τι αφορά στην προέλευση των δεδομένων το “effect” παίζει σημαντικό ρόλο. Αν επιλέγαμε το Move αντί του Copy κι αν ο χρήστης είχε σύρει κάποιο απόσπασμα κειμένου, κατά την απόθεση (drop) το κείμενο θα διαγραφόταν από την αρχική του θέση. Με τη χρήση του Copy, όμως, η πηγή των δεδομένων δεν επηρεάζεται καθόλου. Η απαρίθμηση DragDropEffects περιλαμβάνει τα εξής μέλη:

DragDropEffects.Move
DragDropEffects.Copy
DragDropEffects.Link
DragDropEffects.Scroll
DragDropEffects.All
DragDropEffects.None

Το τελευταίο έχει ως αποτέλεσμα την εμφάνιση του συμβόλου της απαγόρευσης και αξιοποιείται για να δηλώσει ότι το drag’n’drop δεν υποστηρίζεται ή δεν επιτρέπεται. Η λειτουργία των υπολοίπων είναι λίγο πολύ προφανής.

Όποιο effect κι αν επιλέξουμε, αν δεν γράψουμε κώδικα για το χειρισμό των εισερχόμενων δεδομένων δεν θα συμβεί τίποτα. Αυτό μπορούμε να το διαπιστώσουμε εύκολα, κάνοντας μια μεταγλώττιση και μερικές δοκιμές με το ποντίκι. Για να λειτουργήσει το drag’n’drop σύμφωνα με τις προσδοκίες μας πρέπει να τις υλοποιήσουμε (τις προσδοκίες :D). Ας δούμε τον κώδικα που γράψαμε για το event DragDrop:

void TextBoxDragDrop(object sender, DragEventArgs e)
{
	if(e.Data.GetDataPresent(DataFormats.FileDrop)) {
        	string[] droppedFiles =
        		(string[])e.Data.GetData(DataFormats.FileDrop);
		LoadText(droppedFiles[0]);
	}
	if (e.Data.GetDataPresent(DataFormats.Text)){
		string droppedText = (string)e.Data.GetData(DataFormats.Text);
		int cursorPosition = textBox.SelectionStart;
		textBox.Text = textBox.Text.Insert(cursorPosition, droppedText);
		textBox.SelectionStart = cursorPosition + droppedText.Length;
	}
}

Όπως μπορείτε να διαπιστώσετε εύκολα, εξετάζουμε κι αντιμετωπίζουμε κάθε περίπτωση διαφορετικά. Ο βασικός έλεγχος, ο τύπος των δεδομένων που “έριξε” ο χρήστης, πραγματοποιείται όπως και πριν.

Στην περίπτωση της απόθεσης αρχείων χρησιμοποιούμε τη μέθοδο GetData, ώστε να διαβάσουμε τις πληροφορίες που μεταφέρει το αντικείμενο DragEventArgs. Σε αυτή τη μέθοδο δίνουμε ως παράμετρο το FileDrop κι έτσι λαμβάνουμε έναν πίνακα με τα ονόματα των αρχείων που απόθεσε ο χρήστης. Επειδή το deltaPad μπορεί να ανοίγει μόνο ένα κείμενο τη φορά, στην περίπτωση που ο χρήστης έχει αποθέσει πολλά, το πρόγραμμα ασχολείται μόνο με το πρώτο. Ακριβώς γι’ αυτό, διαβάζουμε το στοιχείο του πίνακα υπ αριθμόν 0. Αυτό το στοιχείο χρησιμοποιείται ως παράμετρος για την κλήση της LoadText που, όπως μπορείτε να δείτε, έχει υποστεί ανανέωση:

private void LoadText(string filePath) {
	if(textChanged) {
		if(AskSave() == DialogResult.Cancel)
			return;
	}
	
	if(filePath == null) {
		DialogResult result = openFileDialog.ShowDialog(this);
		if(result == DialogResult.OK) {
			filePath = openFileDialog.FileName;
		} else {
			return;
		}
	}

	try {
		textBox.Text = File.ReadAllText(filePath) ;
		textChanged = false;
		this.Text = "DeltaPad - " + Path.GetFileName(filePath);
	} catch(Exception err) {
		MessageBox.Show(err.Message, "Σφάλμα φόρτωσης αρχείου",
			MessageBoxButtons.OK, MessageBoxIcon.Error);
	}
}

Όπως βλέπετε, η ανανεωμένη LoadText δέχεται την παράμετρο filePath. Προφανώς, πρόκειται για μια συμβολοσειρά που περιέχει το όνομα του προς φόρτωση αρχείου. Ο κώδικας της μεθόδου τσεκάρει αν η παράμετρος έχει τιμή ή όχι (null) και στη δεύτερη περίπτωση εμφανίζει το παράθυρο επιλογής αρχείου. Έτσι, όταν η LoadText καλείται από κάποιο συμβάν drag’n’drop, η παράμετρος filePath διαθέτει τιμή και το πρόγραμμα φορτώνει το αρχείο χωρίς να εμφανίζει το παράθυρο επιλογής. Η επέμβαση που κάναμε στη loadText, ώστε να περιμένει πλέον μία παράμετρο, θα δημιουργήσει προβλήματα στα σημεία όπου γινόταν κλήση της μεθόδου χωρίς παράμετρο. Επομένως, πρέπει να επισκεφθούμε κάθε σημείο από το οποίο καλείται η LoadText και να προσθέσουμε την παράμετρο null. Για παράδειγμα, όταν κάνουμε κλικ επάνω στην επιλογή Open του μενού, η κλήση της LoadText πρέπει να γίνεται ως εξής:

void OpenToolStripMenuItemClick(object sender, EventArgs e) {
	LoadText(null);
}

Στην περίπτωση που το drag’n’drop μεταφέρει κάποιο απόσπασμα κειμένου, εισάγουμε το κείμενο στο σημείο που βρίσκεται ο κέρσορας. Ο κώδικας που το πετυχαίνει αυτό λειτουργεί όπως κι εκείνος που είχαμε δει για την αυτόματη εισαγωγή της ημερομηνίας και της ώρας.

Το DeltaPad υποστηρίζει πλέον και το drag'n'drop. Αποθέτοντας επάνω του ένα αρχείο κειμένου, το περιεχόμενό του φορτώνεται αυτόματα!

Το DeltaPad υποστηρίζει πλέον και το drag’n’drop. Αποθέτοντας επάνω του ένα αρχείο κειμένου, το περιεχόμενό του φορτώνεται αυτόματα!

Απίθανη συμμαχία
Η C# είναι πανίσχυρη από μόνη της, αλλά οι κλάσεις που προσφέρει το .NET framework την απογειώνουν. Ένα από τα δυνατότερα χαρακτηριστικά του framework είναι η δυνατότητα “σύνδεσης” των εφαρμογών μας με προγράμματα ή και βιβλιοθήκες που είναι γραμμένες σε εγγενή κώδικα ή unmanaged code, όπως ονομάζεται στην ορολογία της πλατφόρμας .NET. (Να υπενθυμίσουμε εδώ ότι τα εκτελέσιμα που παράγονται από τον compiler του .NET δεν περιέχουν κώδικα σε γλώσσα μηχανής, αλλά ένα ενδιάμεσο bytecode γνωστό ως Common Intermediate Language. Αυτός ο κώδικας μετατρέπεται σε κώδικα μηχανής από το CLRuntime, κατά την εκτέλεση του προγράμματος. Καθώς η διαχείριση της μνήμης πραγματοποιείται από το CLR και όχι από τον προγραμματιστή, o κώδικας CIL χαρακτηρίζεται ως “managed code”.) Στη συνέχεια θα εξετάσουμε ένα απλό πρόγραμμα, το οποίο κάνει χρήση αυτής της δυνατότητας. Έτσι, θα δείτε με ποιον τρόπο μπορούμε να αξιοποιούμε άλλα προγράμματα ή βιβλιοθήκες των Windows.

Το πρόγραμμά μας διαθέτει δύο κουμπιά, μέσω των οποίων ανοίγει και κλείνει το πορτάκι του CD/DVD drive. Όσο κι αν ψάξετε στο.NET framework, δεν θα βρείτε καμία κλάση που να σχετίζεται με το θέμα και να προσφέρει αυτή τη λειτουργικότητα. Μήπως πρέπει να σηκώσουμε τα χέρια ψηλά; Προφανώς, δεν θα ξεκινούσαμε όλη αυτή την εισαγωγή για να σας πούμε ότι τα παρατήσαμε. Το λειτουργικό σύστημα της Microsoft περιλαμβάνει από τα γεννοφάσκια του μια βιβλιοθήκη με το όνομα winmm.dll. Εκεί ενσωματώνονται οι συναρτήσεις του Windows Multimedia API, μέσω των οποίων μπορούμε να χειριστούμε την κάρτα ήχου, το joystick, κάθε συσκευή που συνδέεται στο midiport κ.ά. Ανάμεσα στις λειτουργίες που προσφέρει η βιβλιοθήκη περιλαμβάνεται και η αναπαραγωγή των audio CDs και, όπως ήταν αναμενόμενο, η εισαγωγή και η εξαγωγή του CD/DVD tray. Ειδικά γι’ αυτές τις λειτουργίες αξιοποιούνται κάποιες εντολές MCI, αλλά δεν υπάρχει λόγος να μπούμε σε περισσότερες λεπτομέρειες.

Για την κατασκευή του προγράμματος δημιουργήσαμε ένα νέο project τύπου Windows Application και του δώσαμε το όνομα OpticalTray. Στη φόρμα τοποθετήσαμε δύο κουμπιά, με τα ονόματα buttonEject και buttonLoad. Νομίζουμε ότι η αποστολή του καθενός είναι αυτονόητη. Κοντά στα κουμπιά τοποθετήσαμε κι ένα Combo Box, στο οποίο δώσαμε το όνομα comboBoxLetters. Σε αυτό θα εμφανίζονται τα γράμματα του αγγλικού αλφαβήτου και ο χρήστης θα μπορεί να επιλέξει το επιθυμητό drive. Δείτε τον κώδικα που γράψαμε για αυτό το μικρό εργαλείο:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace OpticalTray {
	public partial class MainForm : Form {
		[DllImport("winmm.dll")]
		static extern int mciSendString(String command, String buffer, int bufferSize, IntPtr hwndCallback);

	public MainForm() {
		InitializeComponent();

	comboBoxLetters.DropDownStyle = ComboBoxStyle.DropDownList;
	for (int i=0; i<26; i++ ) {
		comboBoxLetters.Items.Add((char)('A' + i) + ":");
	}
	comboBoxLetters.SelectedIndex = 3;
	}

	void ButtonEjectClick(object sender, EventArgs e) {
		TrayDo(TrayOperation.Eject);
	}

	void ButtonLoadClick(object sender, EventArgs e) {
		TrayDo(TrayOperation.Load);
	}
 
	private enum TrayOperation {
		Eject,
		Load
	}

	private void TrayDo(TrayOperation operation) {
		string drive = (string) comboBoxLetters.Text;
		string driveLetter = drive.Substring(0,1);
		mciSendString("open " + driveLetter + ": type CDAudio alias drive" + driveLetter, null, 0, IntPtr.Zero);
		if(operation == TrayOperation.Eject) {
			mciSendString("set drive" + driveLetter + " door open", null, 0, IntPtr.Zero);
		} else {
			mciSendString("set drive" + driveLetter + " door closed", null, 0, IntPtr.Zero);
			}
		}
	}
}

Μέχρι και την τέταρτη γραμμή είναι όλα γνωστά: Δηλώνονται τα απαραίτητα namespaces για τη δημιουργία της φόρμας και την αλληλεπίδραση με τα στοιχεία της. Στη γραμμή 5, όμως, εισάγουμε έναν χώρο ονομάτων που δεν είχαμε χρησιμοποιήσει στο παρελθόν. Πρόκειται για τον System.Runtime.InteropServices, που όπως συμπεραίνετε από το όνομά του παρέχει τις δυνατότητες διασύνδεσης με unmanaged code.

Στη γραμμή 9 δηλώνουμε τη χρήση της βιβλιοθήκης winmm.dll και, αμέσως μετά, προσδιορίζουμε το λεγόμενο entry point. Με απλά λόγια, καθορίζουμε το σημείο από το οποίο ξεκινά η εκτέλεση του κώδικα της βιβλιοθήκης. Όπως βλέπετε, εμείς επιλέγουμε τη συνάρτηση mciSendString. Παρατηρήστε τη χρήση του τροποποιητή extern, με τον οποίο δηλώνουμε ότι πρόκειται για μια συνάρτηση εκτός του .NET framework και εντός της βιβλιοθήκης που δηλώσαμε με την DllImport. Όσον αφορά τα ορίσματα της mciSendString, αυτά δεν αποτελούν προϊόν τύχης αλλά μιας ενδελεχούς αναζήτησης. Αν σκοπεύετε να χρησιμοποιήσετε τέτοιες συναρτήσεις στα δικά σας προγράμματα, πρέπει προηγουμένως να ανατρέξετε στο Windows API και να βρείτε τις υπογραφές τους. Περισσότερα για τη δήλωση εξωτερικών βιβλιοθηκών και τα entry points μπορείτε να διαβάσετε εδώ.

Ας προχωρήσουμε τώρα στη γραμμή 15, εντός της μεθόδου δημιουργίας του αντικειμένου MainForm. Εκεί αρχικοποιούμε τις τιμές του Combo Box. Αρχικά ορίζουμε την ιδιότητα DropDownStyle σε ComboBoxStyle.DropDownList, ώστε να έχουμε μια στατική λίστα. Ο χρήστης θα μπορεί να επιλέξει οποιαδήποτε από τις τιμές της λίστας, αλλά δεν θα μπορεί να τροποποιήσει καμία. Ακριβώς από κάτω (γραμμές 16 έως 18) ξεκινά ένας βρόχος που εισάγει τις επιλογές της λίστας (τα γράμματα της αλφαβήτου). Στη συνέχεια ορίζουμε ως προεπιλεγμένο στοιχείο το τρίτο, το οποίο αντιστοιχεί στο “D:” και είναι το γράμμα που αναφέρεται συνήθως στο CD/DVD drive.

Στη γραμμή 30 δηλώνουμε την απαρίθμηση TrayOperation, που περιλαμβάνει τα στοιχεία Load και Eject. Αυτή η απαρίθμηση χρησιμοποιείται ως τύπος της παραμέτρου που δέχεται η μέθοδος TrayDo(). Έτσι, οι κλήσεις προς τη συγκεκριμένη μέθοδο θα είναι ιδιαίτερα κομψές: TrayDo(Load) και TrayDo(Eject). Ας εξετάσουμε τώρα τον κώδικα της εν λόγω μεθόδου. Στις γραμμές 36 και 37 “αποσπάμε” το γράμμα από το επιλεγμένο στοιχείο του Combo Box και το αποθηκεύουμε στη μεταβλητή driveLetter. Στη συνέχεια (γραμμή 38) καλούμε για πρώτη φορά τη μέθοδο mciSendString.

Με τη βοήθεια της βιβλιοθήκης winmm.dll, το μικρό μας πρόγραμμα είναι στη θέση να ανοίξει και να κλείσει το συρταράκι του DVD drive. Ο ενθουσιασμός μας δεν έχει να κάνει με τον έλεγχο του DVD, αλλά με τη δυνατότητα αξιοποίησης των βιβλιοθηκών των Windows.

Με τη βοήθεια της βιβλιοθήκης winmm.dll, το μικρό μας πρόγραμμα είναι στη θέση να ανοίξει και να κλείσει το συρταράκι του DVD drive. Ο ενθουσιασμός μας δεν έχει να κάνει με τον έλεγχο του DVD, αλλά με τη δυνατότητα αξιοποίησης των βιβλιοθηκών των Windows.

Ουσιαστικά, αυτή η κλήση είναι προπαρασκευαστική και δημιουργεί ένα alias που θα αξιοποιήσουμε αμέσως μετά, για το άνοιγμα ή το κλείσιμο του “συρταριού”. Φυσικά, το περιεχόμενο των παραμέτρων συγκροτείται σύμφωνα με τις οδηγίες του Windows Multimedia API και δεν υπάρχει λόγος να επεκταθούμε σε αυτό το θέμα. Αμέσως μετά, η μέθοδος ελέγχει αν η τιμή της παραμέτρου operation είναι Eject ή Load. Σε κάθε περίπτωση πραγματοποιείται μια κατάλληλη κλήση της μεθόδου mciSendString. Αυτή η κλήση (η δεύτερη) πραγματοποιεί την αναμενόμενη ενέργεια και ανοίγει ή κλείνει το tray. Μπορείτε να κατεβάσετε τον κώδικα αυτού του μικρού προγράμματος.

Δεν ξέρουμε αν το καταλάβατε, αλλά με τη βοήθεια των InteropServices μπορείτε να χρησιμοποιείτε το Windows API κανονικότατα. Πλέον, μπορείτε να πετύχετε στα Windows οτιδήποτε έκαναν και οι φίλοι που προγραμματίζουν σε C++. Εμείς από πλευράς μας, δεν έχουμε παρά να σας ευχηθούμε καλό ταξίδι!

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων